为什么汇总分组未返回分组分组

问题描述 投票:0回答:1

我的数据框为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
python pandas pandas-groupby
1个回答
0
投票

数据框上,按照您的方式创建,两者的结果您的指示是:

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。如果您使用的是旧版本,请升级并重复测试。

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

注意,如果您创建了一个empty数据框,则Pandas没有有关列类型的信息。通常(如果提供了一些数据行),则类型为从源数据推断出,但不是您的情况。

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

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

如何正确处理

定义了DataFrame后,至少更改user_paid_amount的列类型:

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

然后执行:

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

给出“正常”结果:

Empty DataFrame
Columns: [uid, vertical, user_paid_amount]
Index: []
© www.soinside.com 2019 - 2024. All rights reserved.