2017-10-18 63 views
1

我想知道如何做就取決於另一列的值的列之和(0或1)的Python:熊貓總和超過一個條件

id area PP 
a 0,95999998 0 
a 0,44 1 
b 1,6900001 0 
c 2 0 
d 5,8499999 0 
e 0,66000003 1 

我可以找到每個區域ID

surface_id = df.groupby("id")["area"].sum() 

但我也希望是ID中的區域,如果PP = 1得到的東西是這樣的:

id area_PP 
a 0,44 
b 0 
c 0 
d 0 
e 0,66000003 

回答

3

嘗試:

df.eval('area * PP').groupby(df.id).sum() 

該工作方式只需將area列乘以PP列即可。 0自然會適當地取消area

我選擇使用eval,因爲它比較涼爽,對於大數據應該更快。

這做同樣的事情

(df.area * df.PP).groupby(df.id).sum() 
+0

它就像一個魅力! Tahnks。請問代碼是如何工作的?是否像每個行的區域* PP,然後通過ID的總和? –

+0

是的!我更新了我的答案來解釋。 – piRSquared

+0

好的你的解決方案簡單而快速,但如果不是0和1而是「A和B」呢?我知道這與我的第一個問題有點不同,但我試圖找到一種可以在大多數情況下工作的方式。 –

3

一種方法使用變換,但不再

df['area_pp'] = df[df.PP == 1].groupby("id")["area"].transform('sum') 
df.fillna(0, inplace = True) 

    id area  PP area_pp 
0 a 0,95999998 0 0 
1 a 0,44  1 0,44 
2 b 1,6900001 0 0 
3 c 2   0 0 
4 d 5,8499999 0 0 
5 e 0,66000003 1 0,66000003 
+1

我已經寫了同樣的信給我發誓 – Dark

+1

@Bharathshetty,發生所有的時間:) – Vaishali

0

另一種方式:

total=df.groupby(['id', 'PP'])['area'].sum().reset_index(level=1) 
total[total.PP==1].drop(axis=1, labels='PP') 
0

如果你只是想在陽性標記的情況下,輸出:

df = pd.DataFrame({'id': ('a', 'a', 'b', 'c', 'd', 'e'), 'area': (0.96, 0.44, 
1.69, 2., 5.85, 0.66), 'PP': (0, 1, 0, 0, 0, 1)}) 
df2 = df.where(df.PP==1).groupby('id')['area'].sum()