我在使用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