首页 > 解决方案 > 如何根据熊猫中列的条件进行聚合?

问题描述

我有一个如下所示的数据框:

    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

聚合应该计算每个 id 的标志数量,并且当标志设置为 1 时,费用应该是每个 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 表。

谢谢!

标签: python-3.xpandas

解决方案


您需要检查条件flag==1fee在这样做时,您可以乘以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

如果您只想计算/求和where ,您可以先进行查询flag==1

(df.query('flag==1')
   .groupby('id', as_index=False)
   .agg({'flag':'count', 'fee':'sum'})
)

顺便说一下,它给出了与上面相同的输出。


推荐阅读