我的输入数据:
df=pd.DataFrame({'ID':['A','B','C','D'],
'Group':['group1','group1','group2','group2'],
'Flag_1':[1,0,0,1],
'Flag_2':[1,1,0,1],
'Value':[30,40,60,70]
})
当标志等于 1 时,我尝试将每个组的“值”相加。我的预期输出是:
df_value_group=pd.DataFrame({
'Flag_1 Sum':[1,1],
'Flag_2 Sum':[2,1],
'Value_1 Sum':[30,70],
'Value_2 Sum':[70,70]},
index=['group1','group2'])
我尝试过这个但是它抛出了一个 AssertionError 错误,主要是由于后两个 lambda 函数。
df.groupby('Group').agg(
**{ 'Flag_1 Sum': ('Flag_1','sum'),
'Flag_2 Sum': ('Flag_2','sum'),
'Value_1 Sum': ('Flag_1', lambda col: df.loc[col.eq(1), 'Value'].sum()),
'Value_2 Sum': ('Flag_2', lambda col: df.loc[col.eq(1), 'Value'].sum())
})
更有效的形式是在分组之前计算布尔值:
对于通用方法,您可以使用自定义
groupby.agg
(命名聚合):注意:
lambda x: val[x.index][x==1].sum()
可以用 代替lambda x: val.where(x==1).sum()
。或者用 重塑
melt
并聚合pivot_table
:输出:
您想要聚合
'Value'
,而不是'Flag_X'
使用where函数创建 lambda 函数
出去:
如果有很多列与之对应
Flag
,或者整行很长并且效率很重要,则最好为每个列创建一个groupby,然后使用concat函数。相同的结果