首页 > 解决方案 > 使用 NamedAgg 聚合带有条件的 Pandas DataFrame

问题描述

我有一个带有 order_state 列的订单表。并且需要计算每个订单状态的订单,按小时分组,但不使用按 order_state 列分组。我想使用 NamedAgg。可能吗?像这样的东西:

orders_agg = orders.groupby(
    by=[pandas.Grouper(key='created_at', freq='H'), 'source']
).agg(
    orders_count=pandas.NamedAgg('created_at', 'count'),
    finished_orders_count=pandas.NamedAgg('order_state', lambda x: (x == 'finished').count()),
    cancelled_orders_count=pandas.NamedAgg('order_state', lambda x: (x == 'offer_cancelled').count())
).reset_index().rename(columns={'created_at': 'datetime_msk'})

结果应该是: 在此处输入图像描述 但现在我得到每列的总订单数。

标签: pythonpandasdataframeaggregate

解决方案


我认为您需要更改.count().sum()for countTrue的值:

orders_agg = orders.groupby(
by=[pandas.Grouper(key='created_at', freq='H'), 'source']
).agg(
orders_count=pandas.NamedAgg('created_at', 'count'),
finished_orders_count=pandas.NamedAgg('order_state', lambda x: x == 'finished').sum(),
    cancelled_orders_count=pandas.NamedAgg('order_state', lambda x: (x == 'offer_cancelled').sum())
).reset_index().rename(columns={'created_at': 'datetime_msk'})

推荐阅读