了解熊猫 groupby().agg() 值

时间:2021-03-09 10:16:57

标签: python pandas numpy

我遇到了一些用于测试辛普森悖论的代码,但我对它的工作原理感到困惑。

数据格式如下:

enter image description here

当我跑步时

gb = df_.groupby(["kidney_stone_size", "treatment"]).agg([np.sum, lambda x: len(x)])
gb

我明白

enter image description here

我无法完全理解 df_.groupby(["kidney_stone_size", "treatment"]).agg([np.sum, lambda x: len(x)]) 的作用。

首先,聚合数据似乎是从 groupby 部分中省略的列中计算出来的,就像我一样

gb = df_.groupby(["recovery", "treatment"]).agg([np.sum, lambda x: len(x)])

我明白

enter image description here

那么这是默认行为 - 为缺失的列计算聚合数据吗?

我知道您可以在字典中明确指定列,但我试图按原样理解代码。

.agg([np.sum, lambda x: len(x)]) 究竟在计算什么?

np.sum 究竟是应用于什么,同样是 lambda x: len(x)

请理解,我的理解中可能存在一些概念上的差距,这可能会使从外部显而易见的事情对我来说不明显。非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

<块引用>

那么这是默认行为 - 为缺失的列计算聚合数据吗?

我认为是的,如果在 groupby 之后没有指定要处理的列,pandas 将使用 groupby 中未使用的所有列并应用聚合函数。

<块引用>

.agg([np.sum, lambda x: len(x)]) 究竟计算了什么

这里 sum 用于非数字列,如 join,对于数字获取 sum,您的自定义函数 lambda x: len(x) 返回组的长度 - 数字和非数字。

df_ = pd.DataFrame({
        'kidney_stone_size':list('aaaaaa'),
         'recovery':[4,5,4,5,5,4],
         'col1':[1,3,5,7,1,0],
         'col2':['new'] * 6,
         'treatment':list('aaabbb')
})

df = df_.groupby(["kidney_stone_size", "treatment"]).agg([np.sum, lambda x: len(x)])
print (df)
                            recovery            col1                  col2  \
                                 sum <lambda_0>  sum <lambda_0>        sum   
kidney_stone_size treatment                                                  
a                 a               13          3    9          3  newnewnew   
                  b               14          3    8          3  newnewnew   

                                        
                            <lambda_0>  
kidney_stone_size treatment             
a                 a                  3  
                  b                  3  

但是如果只使用聚合函数处理像 sum 这样的数字,pandas 默认省略非数字列:

df = df_.groupby(["kidney_stone_size", "treatment"]).sum()
print (df)
                             recovery  col1
kidney_stone_size treatment                
a                 a                13     9
                  b                14     8