2017-11-24 5 views
0

두 번째 열의 값에 대해 열의 값을 groupby으로 합산하려고 시도하지만 한편으로 세 번째 열의 값도 고려하면 df은 다음과 같습니다.팬더 다른 열의 값에 따라 열의 합계를 집계하는 방법

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 

id 그룹화하고 싶은 amount 합계 있지만, 각 그룹은 memo 경우 pos가 양 및 음의 예에 대한 것이다 neggroupby1 일 때, -1.0 - 2.0 + 3.0 = 0이므로 총량은 0입니다.

내가 df.groupby('id')['amount'].sum()을 수행하는 경우 과 amount 열만 고려하면 memo도 고려해야합니다.

그래서 결과가 모양을

,

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

당신은 내가 첫 번째 단계에' '안양를 numpy.where'를 사용하는 것이 좋습니다 것이 조금 – daiyue

+0

[ "임시"] = np.where (안양 [ "메모"] == "NEG 코드를 설명 할 수 ", -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 
관련 문제