我想知道如何根据另一列(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
答案 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()