如何在pandas中按多列分组并进行聚合

11

我在pandas中有以下数据帧:

 ID     Balance     ATM_drawings    Value
 1      100         50              345 
 1      150         33              233
 2      100         100             333 
 2      100         100             234
我希望你能够以期望的格式提供数据。

I want data in that desired format

翻译为:

我希望以期望的格式获取数据。

 ID     Balance_mean    Balance_sum     ATM_Drawings_mean    ATM_drawings_sum 
 1      75              250             41.5                 83 
 2      200             100             200                  100
我正在使用以下命令在pandas中完成它。
 df1= df[['Balance','ATM_drawings']].groupby('ID', as_index = False).agg(['mean', 'sum']).reset_index()

但是,它没有给我想要得到的东西。

2个回答

24
您可以使用字典为每个系列指定聚合函数:
d = {'Balance': ['mean', 'sum'], 'ATM_drawings': ['mean', 'sum']}
res = df.groupby('ID').agg(d)

# flatten MultiIndex columns
res.columns = ['_'.join(col) for col in res.columns.values]

print(res)

    Balance_mean  Balance_sum  ATM_drawings_mean  ATM_drawings_sum
ID                                                                
1            125          250               41.5                83
2            100          200              100.0               200

或者,您可以通过dict.fromkeys来定义d

d = dict.fromkeys(('Balance', 'ATM_drawings'), ['mean', 'sum'])

我该如何将列名更改为所需的名称?它似乎是多级索引数据框。 - Neil
我可以使用以下代码完成此操作:credit_card_bal.groupby('ID', as_index = False).agg({'Balance':['sum','mean'], 'ATM_drawings':['sum','mean']}).reset_index() - Neil
运行完美,但我得到了一个名为ID_的列,如何从ID列中删除_ - Neil
根据我的示例,如果您不使用reset_index,则应该得到ID_。您可以将其作为最后一步执行:df = df.reset_index() - jpp

3

我不确定如何使用agg来实现这一点,但是你可以重复使用“groupby”对象,避免多次执行操作,然后使用转换:

import pandas as pd

df = pd.DataFrame({
    "ID": [1, 1, 2, 2],
    "Balance": [100, 150, 100, 100],
    "ATM_drawings": [50, 33, 100, 100],
    "Value": [345, 233, 333, 234]
})

gb = df.groupby("ID")
df["Balance_mean"] = gb["Balance"].transform("mean")
df["Balance_sum"] = gb["Balance"].transform("sum")
df["ATM_drawings_mean"] = gb["ATM_drawings"].transform("mean")
df["ATM_drawings_sum"] = gb["ATM_drawings"].transform("sum")
print df

这将产生:

   ID  Balance  Balance_mean  Balance_sum  ATM_drawings  ATM_drawings_mean  ATM_drawings_sum  Value
0   1      100           125          250            50               41.5                83    345
1   1      150           125          250            33               41.5                83    233
2   2      100           100          200           100              100.0               200    333
3   2      100           100          200           100              100.0               200    234

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接