首页 > 解决方案 > 为什么按聚合分组没有按列返回分组

问题描述

我有空数据框columns: [order_id, uid, payment_channel, user_paid_amount, vertical]

当我使用df.groupby(['uid','vertical']).payment_channel.agg('count').reset_index() 它返回空数据框时Columns: [uid, vertical, total_transaction]

但是当我使用df.groupby(['uid','vertical']).user_paid_amount.agg('sum').reset_index() 它返回空数据框时Columns: [index, gmv]

如何使用聚合求和函数但仍保持uidvertical

编辑 示例数据框

IN [] :  empty_df = pd.DataFrame(columns=['uid','vertical','topup_payable_amount'])
         empty_df.dtypes
OUT[] :  uid                     object
         vertical                object
         topup_payable_amount    object
         dtype: object

标签: pythonpandaspandas-groupby

解决方案


在按照您的方式创建的数据框上,您的两个指令的结果是:

Empty DataFrame
Columns: [uid, vertical, payment_channel]
Index: []

Empty DataFrame
Columns: [index, user_paid_amount]
Index: []

请注意,就聚合列而言,我得到了 原始列名。

您可以“重命名”此列,将name参数传递给reset_index,例如 df.groupby(['uid','vertical']).user_paid_amount.agg('sum').reset_index(name='xyz') (或任何其他名称)。

我使用Pandas版本0.25.3Python版本3.8.0。如果您有一些旧版本,请升级并重复测试。

现在让我们来看看结果中分组列的名称。

请注意,如果您创建了一个的DataFrame,则Pandas没有关于列类型的信息。通常(如果提供了一些数据行),每列的类型将从源数据中推断出来,但在您的情况下不是。

这就是为什么所有列(包括user_paid_amount)的类型都设置为object的原因。

结果是你不能对这样的列求和(你只能在数字列上)。显然, Pandas代码并没有引发异常,而是采用了一些“异常”的执行路径,给出了上述奇怪的结果(名为index的分组列)。

如何把事情做对

定义 DataFrame 后,更改列类型,至少对于user_paid_amount

empty_df.user_paid_amount = empty_df.user_paid_amount.astype(float)

然后执行:

print(empty_df.groupby(['uid','vertical']).user_paid_amount.agg('sum').reset_index())

给出“正常”结果:

Empty DataFrame
Columns: [uid, vertical, user_paid_amount]
Index: []

最后一句话:不要使用empty_df这样的名称。这个 Dataframe 在创建之后暂时是空的,但稍后它会包含一些数据(并且不会为空)。


推荐阅读