如何在 Pandas 0.21+ 中对多列进行 groupby() 聚合并重命名多索引?

Geo*_*eRF 4 python pandas sklearn-pandas pandas-groupby

代码

import pandas as pd
df = pd.DataFrame({'A': [1, 1, 1, 2, 2],
                    'B': range(5),
                    'C': range(5)})

df1 = df.groupby('A').B.agg({'B': ['count','nunique'],'C': ['sum','median']})
df1.columns = ["_".join(x) for x in df1.columns.ravel()]
Run Code Online (Sandbox Code Playgroud)

df1 输出

   B_count  B_nunique  C_sum  C_median
A                                     
1        3          3      3       1.0
2        2          2      7       3.5
Run Code Online (Sandbox Code Playgroud)

警告

__main__:1: FutureWarning: using a dict on a Series for aggregation
is deprecated and will be removed in a future version
Run Code Online (Sandbox Code Playgroud)

这是 Pandas 0.20 之前推荐的分组和重命名方式。在没有此警告的情况下实现相同 df1 输出的优雅方法是什么?

Sco*_*ton 9

正如@Wen 在问题评论中所述,删除 agg 之前的“.B”,并且 agg 内的字典是正确的。接下来,您可以使用mapjoin来展平该多索引列。

import pandas as pd
df = pd.DataFrame({'A': [1, 1, 1, 2, 2],
                    'B': range(5),
                    'C': range(5)})

df1 = df.groupby('A').agg({'B': ['count','nunique'],'C': ['sum','median']})
df1.columns = df1.columns.map('_'.join)
Run Code Online (Sandbox Code Playgroud)

输出:

   B_count  B_nunique  C_sum  C_median
A                                     
1        3          3      3       1.0
2        2          2      7       3.5
Run Code Online (Sandbox Code Playgroud)