システム: O365
IDE: JupyterLab
言語: Python バージョン 3.7.3
ライブラリ: pandas バージョン 1.0.1
データ ソース: 個人的に作成した
HTTP API ドキュメント: https://github.com/RTICWDT/open-data-maker/blob/master/API.md
こんにちは。列範囲内の条件設定を利用して値を返す方法を知っている人がいるかどうか疑問に思っています。たとえば、次の値グループが表示されると変化する範囲内の同様の値に基づいて Z スコアを返したいと考えています。
実行された手順:
以下の関数を構築しました。半分まで進んだように見えますが、まだ完全ではありません
コード:
# get data
df0 = pd.read_csv('data/erpservicedesk.csv')
df0.columns
# put z-score into a lamda
zscore = lambda x: (x - x.mean()) / x.std()
# build datafram with the important features
df1 = df0[['Incident ID*+', 'Res.Prod.Cat.TierII', 'Res.Op.Cat.TierIII', 'Mean-Time-Tckt-Close']]
df1.insert(4,'ZofMTTC',df1.groupby(['Res.Prod.Cat.TierII', 'Res.Op.Cat.TierIII'])['Mean-Time-Tckt-Close'].transform(zscore))
df2 = df1.sort_values(by=['Res.Prod.Cat.TierII'])
df2.head(100)
問題
私のラムダ関数は、データフレーム全体の「Mean-Time-Tckt-Close」を取るようであるため、新しい列の値に基づいた条件付きではないようです。「Res.Prod.Cat.TierII」の新しい各インスタンスではなく、私。
例
A B C
Bob Store 10
Bob Store 11
Bob Store 8
Alfred Store 12
Alfred Store 9
ボブとアルフレッドのそれぞれのデータに基づいた Z スコアを反映するには、新しい列 D が必要です。
------------------------
この例を使用すると、.groupby を使用して平均と標準偏差を保存する dfs を作成し、ラムダ関数でこれらにアクセスできます。
import pandas as pd
## recreate example df
df = pd.DataFrame({'A':['Bob']*3+['Alfred']*2, 'B':['Store']*5, 'C':[10,11,8,12,9]})
df_mean = df.groupby('A').mean()
df_std = df.groupby('A').std()
## apply the function along each row, using axis=1
df['D'] = df.apply(lambda x: (x['C'] - df_mean.loc[x['A']]) / df_std.loc[x['A']], axis=1)
出力:
>>> df
A B C D
0 Bob Store 10 0.218218
1 Bob Store 11 0.872872
2 Bob Store 8 -1.091089
3 Alfred Store 12 0.707107
4 Alfred Store 9 -0.707107
2
1
この方法は見事に機能します。ただし、データ フレーム スライスに列を追加しようとすると、次のようなエラーが発生し始めていることに気付きました。「データフレームのスライスのコピーに値を設定しようとしています。」代わりに .loc[row_indexer,col_indexer] = value を使用してみてください。ドキュメントを読むと、パンダは基本的に元のデータ フレームに追加するか、まったく新しいデータ フレームを作成することを要求しているようです。
– アルフレッド・ハル
2020 年 9 月 7 日 19:17
1
これは、データフレーム スライスを操作しているときに発生しますが、元の df のスライスを変更するかどうかが曖昧で、連鎖割り当てを使用しているときに発生します。例: df[df['some_column']== 10]['some_other_column'] = 1000 はエラーをスローします。
– デレク O
2020 年 9 月 7 日 20:04