在Pandas聚合函数中命名返回的列?[重复]
问题内容:
这个问题已经在这里有了答案 :
使用pandas GroupBy.agg()对同一列进行多次聚合 (3个答案)
去年关闭。
我在使用Pandas的groupby功能时遇到了麻烦。我已经阅读了文档,但是看不到如何将聚合函数应用于多个列 并 为这些列使用自定义名称。
这非常接近,但是返回的数据结构具有嵌套的列标题:
data.groupby("Country").agg(
{"column1": {"foo": sum()}, "column2": {"mean": np.mean, "std": np.std}})
(即,我想获取column2的均值和std,但将这些列返回为“ mean”和“ std”)
我想念什么?
问题答案:
这将从层次列索引中删除最外层:
df = data.groupby(...).agg(...)
df.columns = df.columns.droplevel(0)
如果要保留最外层,可以在多层列上使用ravel()函数形成新标签:
df.columns = ["_".join(x) for x in df.columns.ravel()]
例如:
import pandas as pd
import pandas.rpy.common as com
import numpy as np
data = com.load_data('Loblolly')
print(data.head())
# height age Seed
# 1 4.51 3 301
# 15 10.89 5 301
# 29 28.72 10 301
# 43 41.74 15 301
# 57 52.70 20 301
df = data.groupby('Seed').agg(
{'age':['sum'],
'height':['mean', 'std']})
print(df.head())
# age height
# sum std mean
# Seed
# 301 78 22.638417 33.246667
# 303 78 23.499706 34.106667
# 305 78 23.927090 35.115000
# 307 78 22.222266 31.328333
# 309 78 23.132574 33.781667
df.columns = df.columns.droplevel(0)
print(df.head())
产量
sum std mean
Seed
301 78 22.638417 33.246667
303 78 23.499706 34.106667
305 78 23.927090 35.115000
307 78 22.222266 31.328333
309 78 23.132574 33.781667
或者,要保留索引的第一级:
df = data.groupby('Seed').agg(
{'age':['sum'],
'height':['mean', 'std']})
df.columns = ["_".join(x) for x in df.columns.ravel()]
产量
age_sum height_std height_mean
Seed
301 78 22.638417 33.246667
303 78 23.499706 34.106667
305 78 23.927090 35.115000
307 78 22.222266 31.328333
309 78 23.132574 33.781667