元のDataFrameと同じ詳細レベル(同じ観測カウント)でgroupby-dataに対して実行された結果を取得するには、変換関数を使用しました。
例:元のデータフレーム
name, year, grade
Jack, 2010, 6
Jack, 2011, 7
Rosie, 2010, 7
Rosie, 2011, 8
groupby変換後
name, year, grade, average grade
Jack, 2010, 6, 6.5
Jack, 2011, 7, 6.5
Rosie, 2010, 7, 7.5
Rosie, 2011, 8, 7.5
ただし、複数の列に基づくより高度な関数を使用すると、状況はさらに複雑になります。私を困惑させるのは、groupby-transformの組み合わせで複数の列にアクセスできないように見えることです。
df = pd.DataFrame({'a':[1,2,3,4,5,6],
'b':[1,2,3,4,5,6],
'c':['q', 'q', 'q', 'q', 'w', 'w'],
'd':['z','z','z','o','o','o']})
def f(x):
y=sum(x['a'])+sum(x['b'])
return(y)
df['e'] = df.groupby(['c','d']).transform(f)
私に与える:
KeyError: ('a', 'occurred at index a')
私は以下がうまくいくことを知っていますが:
df.groupby(['c','d']).apply(f)
この動作の原因と、次のようなものを取得するにはどうすればよいですか。
a b c d e
1 1 q z 12
2 2 q z 12
3 3 q z 12
4 4 q o 8
5 5 w o 22
6 6 w o 22
この特定のケースでは、次のことができます。
g = df.groupby(['c', 'd'])
df['e'] = g.a.transform('sum') + g.b.transform('sum')
df
# outputs
a b c d e
0 1 1 q z 12
1 2 2 q z 12
2 3 3 q z 12
3 4 4 q o 8
4 5 5 w o 22
5 6 6 w o 22
同じgroupby上の独立した変換の線形結合によって最終結果を構築できる場合、この方法は機能します。
それ以外の場合は、groupby-apply
とマージして元のdfに戻します。
例:
_ = df.groupby(['c','d']).apply(lambda x: sum(x.a+x.b)).rename('e').reset_index()
df.merge(_, on=['c','d'])
# same output as above.
GroupBy
+ transform
とsum
を2回使用できます。
df['e'] = df.groupby(['c', 'd'])[['a', 'b']].transform('sum').sum(1)
print(df)
a b c d e
0 1 1 q z 12
1 2 2 q z 12
2 3 3 q z 12
3 4 4 q o 8
4 5 5 w o 22
5 6 6 w o 22