2017-11-24 8 views
0

groupbyで列の値を2列目の値に合計しようとしていますが、3列目の値も考慮して、dfは、パンダ他の列の値に応じて列の合計を集計する方法

私は memoposであれば、それが正と負の、例えばのための neg idamountが、各グループでグループ化する
id memo amount 
1 pos  1.0 
1 pos  2.0 
1 neg  3.0 
2 pos  4.0 
2 pos  5.0 
2 neg  6.0 
2 neg  7.0 

groupby1の場合、-1.0 - 2.0 + 3.0 = 0であるため、合計量は0です。

df.groupby('id')['amount'].sum()を実行すると、idamountの列しか考慮されません。ここでもmemoを考慮する方法がわかります。

ので、結果は2段階の動作を分割

id memo amount total_amount 
1 pos  1.0  0.0 
1 pos  2.0  0.0 
1 neg  3.0  0.0 
2 pos  4.0  -4.0 
2 pos  5.0  -4.0 
2 neg  6.0  -4.0 
2 neg  7.0  -4.0 

答えて

1

、次のようになります、あなたは

df['temp'] = np.where(df.memo == 'pos', df.amount, -df.amount) 
df['total_amount'] = df.groupby('id').temp.transform(sum) 
+0

あなたは私が最初のステップ 'のDF [ "TEMP"] = np.where(DF [ "メモ"] ==" NEGに 'numpy.where'を使用することをお勧めコードビット – daiyue

+0

を説明することができます"、-df [" amount "]、df [" amount "])' – user32185

+1

@ user32185:そうですね、少し上手くやっているようです。 'df.amount * np.where(df.memo == 'pos'、1、-1)という妥協案を少しでも打ち負かす。 – fuglede

1

て何をしたいマッピングのもう一つの楽しみの方法を達成し、すなわち

を掛けることができます
df['new'] = (df.set_index('id')['memo'].map({'pos':1,'neg':-1})*df['amount'].values)\ 
      .groupby(level=0).transform(sum).values 

出力:

id memo amount new 
0 1 pos  1.0 0.0 
1 1 pos  2.0 0.0 
2 1 neg  3.0 0.0 
3 2 pos  4.0 -4.0 
4 2 pos  5.0 -4.0 
5 2 neg  6.0 -4.0 
6 2 neg  7.0 -4.0 
関連する問題