如何根据大熊猫中一列的条件进行汇总?

时间:2020-05-12 22:47:59

标签: python-3.x pandas

我有一个看起来像这样的数据框:

    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表。

谢谢!

1 个答案:

答案 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'})
)

附带提供与上述相同的输出。