Python:Pandas Sum有多个条件

时间:2017-10-18 14:24:25

标签: python pandas sum pandas-groupby

我想知道如何根据另一列(0或1)的值对列进行求和

   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

4 个答案:

答案 0 :(得分:3)

尝试:

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

只需将area列与PP列相乘即可。 0自然会恰当地取消area

我选择使用eval,因为它更酷,大数据应该更快。

这也是一样的事情

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

答案 1 :(得分: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

答案 2 :(得分:0)

另一种方式:

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

答案 3 :(得分: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()