2016-12-24 13 views
2

3番目の列に基づいて別の列の数値を合計する合計列を作成しようとしています。私は.groupby()を使用してこれを行うことができますが、これは切り捨てられた列を作成しますが、同じ長さの列が必要です。パンダ - 他の列に基づいて合計列を作成します。

マイコード:

df = pd.DataFrame({'a':[1,2,2,3,3,3], 'b':[1,2,3,4,5,6]}) 
df['total'] = df.groupby(['a']).sum().reset_index()['b'] 

マイ結果:

a b total 
0 1 1 1.0 
1 2 2 5.0 
2 2 3 15.0 
3 3 4 NaN 
4 3 5 NaN 
5 3 6 NaN 

マイ所望の結果:

a b total 
0 1 1 1.0 
1 2 2 5.0 
2 2 3 5.0 
3 3 4 15.0 
4 3 5 15.0 
5 3 6 15.0 

...各'a'列は他の同じ合計を有します。

答えて

5

pandasのgroupby操作からの合計を戻すと、インデックス内のユニークなアイテムの数だけの列が生成されます。 を使用して、元のデータフレームと同じ長さの列(「like-indexed」)をマージせずに生成します。

df['total'] = df.groupby('a')['b'].transform(sum) 
>>> df 
    a b total 
0 1 1  1 
1 2 2  5 
2 2 3  5 
3 3 4  15 
4 3 5  15 
5 3 6  15 
+0

なぜか、それは魅力のように動作します。ありがとうございました! – pshep123

+0

それはあなたのためにうれしい!ドキュメント(私の答えでそれにリンクが追加されたばかり)は、 'transform'が元のデータフレームと同じようにインデックスされたカラムを生成すると言います。つまり、元のデータフレームと同じ長さであり、インデックスの一意の要素だけではありません。 – 3novak

関連する問題