在Pandas的聚合函数中如何为子级命名

3

利用下一组数据,我使用不同的函数聚合了两个变量。

data= pd.DataFrame({"Gender": ["M", "M", "M", "F", "F"],
                    "Math score": [7,3,8,9,5],
                    "Literature score": [10,7,5,8,8]})
data.groupby(["Gender"]).agg({"Math score": [np.min, np.max, lambda x: np.max(x)-np.min(x)], "Literature score": np.mean})

我得到了下一个结果 聚合结果

问题是我无法重命名子列lambda_0,或任何其他子列。 我尝试在函数列表中使用元组,但没有结果。


你应该使用np.ptp而不是那个lambda。 - user3483203
2个回答

3

定义一个函数

def named_func(x):
    return np.ptp(x)

data.groupby(["Gender"]).agg(
    {"Math score": [np.min, np.max, named_func], "Literature score": np.mean}
)

       Math score                 Literature score
             amin amax named_func             mean
Gender                                            
F               5    9          4         8.000000
M               3    8          5         7.333333

1
或元组!“数学成绩”:['min', 'max', ('named_func',lambda s:(...))]` - rafaelc

3

从pandas 0.25.0开始,重命名聚合是可行的,您无需处理多级索引列标题。

data.groupby("Gender").agg(Math_min=('Math score','min'), 
                           Math_max=('Math score','max'), 
                           Math_diff=('Math score',np.ptp),
                           Lit_mean=('Literature score','mean'))

输出:

        Math_min  Math_max  Math_diff  Lit_mean
Gender                                         
F              5         9          4  8.000000
M              3         8          5  7.333333

我认为lambda在这种格式下不起作用是一个已报告的错误

data.groupby("Gender").agg(Math_min=('Math score','min'), 
                           Math_max=('Math score','max'), 
                           Math_diff=('Math score',lambda x: np.max(x)-np.min(x)),
                           Lit_mean=('Literature score', 'mean'))

产出率

KeyError: "[('Math score', '<lambda>')] not in index"

应该很快修复。


1
请选择这个答案而不是我的 (-: - piRSquared

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