如何在 Pandas 0.21+ 中对多列进行 groupby() 聚合并重命名多索引?
How to groupby() aggregate on multiple columns and rename the multi-index in Pandas 0.21+?
代码
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()]
df1 输出
B_count B_nunique C_sum C_median
A
1 3 3 3 1.0
2 2 2 7 3.5
警告
__main__:1: FutureWarning: using a dict on a Series for aggregation
is deprecated and will be removed in a future version
这是 Pandas 0.20 之前推荐的分组和重命名方式。在没有此警告的情况下实现相同 df1 输出的优雅方法是什么?
正如@Wen在问题评论中所说,去掉agg前的'.B',agg里面的字典就对了。接下来,您可以使用 map
和 join
来展平该多索引列。
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)
输出:
B_count B_nunique C_sum C_median
A
1 3 3 3 1.0
2 2 2 7 3.5
代码
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()]
df1 输出
B_count B_nunique C_sum C_median
A
1 3 3 3 1.0
2 2 2 7 3.5
警告
__main__:1: FutureWarning: using a dict on a Series for aggregation
is deprecated and will be removed in a future version
这是 Pandas 0.20 之前推荐的分组和重命名方式。在没有此警告的情况下实现相同 df1 输出的优雅方法是什么?
正如@Wen在问题评论中所说,去掉agg前的'.B',agg里面的字典就对了。接下来,您可以使用 map
和 join
来展平该多索引列。
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)
输出:
B_count B_nunique C_sum C_median
A
1 3 3 3 1.0
2 2 2 7 3.5