我的数据框为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]
如何使用聚合求和功能,但仍保持uid
和vertical
列
编辑样本数据框
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
在空数据框上,按照您的方式创建,两者的结果您的指示是:
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.3和Python版本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: []