我有一个看起来像这样的数据框:
df:
id|flag|fee
1 |0 |5
1 |0 |5
1 |1 |5
1 |1 |5
DESRIED df_aggregated:
id|flag|fee
1 |2 |10
当标记设置为1时,总计应计算每个ID的标志数,并且每个ID的费用应加总。
df1=df.groupby(['id'])["flag"].apply(lambda x : x.astype(int).count()).reset_index()
df2=df.groupby(['id'])["fee"].apply(lambda x : x.astype(int).sum()).reset_index()
df_aggregated=pd.merge(df1, df2, on='id', how='inner')
ACTUAL df_aggregated:
id|flag|fee
1 |2 |20
我的费用汇总不正确/不完整,因为它没有考虑仅在FLAG = 1时才对费用进行求和的条件。相反,如果对标志的所有费用进行汇总。如何更改我的代码以解决这种情况?它看起来应该像DESIRED df_aggregated表。
谢谢!
答案 0 :(得分:0)
您需要检查条件flag==1
。这样,您可以将fee
乘以df.flag.eq(1)
:
(df.assign(fee=df.fee*df.flag.eq(1))
.groupby('id', as_index=False)
.agg({'flag':'nunique', 'fee':'sum'})
)
输出:
id flag fee
0 1 2 10
如果您想两者都仅对{strong> 进行计数/求和,其中flag==1
,您可以先进行查询:
(df.query('flag==1')
.groupby('id', as_index=False)
.agg({'flag':'count', 'fee':'sum'})
)
附带提供与上述相同的输出。