集計値が必要なのか (この場合、Andy のソリューションが必要なのか)、それとも元のデータフレームに変換したいのかわかりません。後者の場合は、使用できますtransform
In [33]: cols = ['PetalLength', 'PetalWidth']
In [34]: transformed = grouped_iris[cols].transform(sum).sum(axis=1)
In [35]: iris['SumLengthWidth'] = transformed
In [36]: iris.head()
Out[36]:
SepalLength SepalWidth PetalLength PetalWidth Name SumLengthWidth
0 5.1 3.5 1.4 0.2 Iris-setosa 85.4
1 4.9 3.0 1.4 0.2 Iris-setosa 85.4
2 4.7 3.2 1.3 0.2 Iris-setosa 85.4
3 4.6 3.1 1.5 0.2 Iris-setosa 85.4
4 5.0 3.6 1.4 0.2 Iris-setosa 85.4
編集:一般的なケースの例
一般に、 dataframe の場合、 groupbydf
を集計するとsum
、各グループの合計が得られます
In [47]: df
Out[47]:
Name val1 val2
0 foo 6 3
1 bar 17 4
2 foo 16 6
3 bar 7 3
4 foo 6 13
5 bar 7 1
In [48]: grouped = df.groupby('Name')
In [49]: grouped.agg(sum)
Out[49]:
val1 val2
Name
bar 31 8
foo 28 22
あなたの場合、これらを行全体で合計することに興味があります。
In [50]: grouped.agg(sum).sum(axis=1)
Out[50]:
Name
bar 39
foo 50
しかし、それでは 2 つの数字しか得られません。各グループに 1 つ。一般に、これらの 2 つの数値を元のデータフレームに投影する場合は、次を使用しますtransform
。
In [51]: grouped.transform(sum)
Out[51]:
val1 val2
0 28 22
1 31 8
2 28 22
3 31 8
4 28 22
5 31 8
これらの値が によって生成された値とまったく同じであることに注意してくださいagg
。ただし、元の と同じ次元を持っていdf
ます。行 [0, 2, 4] と [1, 3, 5] は同じグループであるため、他のすべての値がどのように繰り返されるかも注目してください。あなたの場合、2 つの値の合計が必要なため、これを行全体で合計します。
In [52]: grouped.transform(sum).sum(axis=1)
Out[52]:
0 50
1 39
2 50
3 39
4 50
5 39
これで、元のデータフレームと同じ長さのシリーズが作成されたので、それを列として割り当てることができます (または、好きなことを行うことができます)。
In [53]: df['val1 + val2 by Name'] = grouped.transform(sum).sum(axis=1)
In [54]: df
Out[54]:
Name val1 val2 val1 + val2 by Name
0 foo 6 3 50
1 bar 17 4 39
2 foo 16 6 50
3 bar 7 3 39
4 foo 6 13 50
5 bar 7 1 39