我遇到了一些用于测试辛普森悖论的代码,但我对它的工作原理感到困惑。
数据格式如下:
当我跑步时
gb = df_.groupby(["kidney_stone_size", "treatment"]).agg([np.sum, lambda x: len(x)])
gb
我明白
我无法完全理解 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)])
我明白
那么这是默认行为 - 为缺失的列计算聚合数据吗?
我知道您可以在字典中明确指定列,但我试图按原样理解代码。
.agg([np.sum, lambda x: len(x)])
究竟在计算什么?
即 np.sum
究竟是应用于什么,同样是 lambda x: len(x)
?
请理解,我的理解中可能存在一些概念上的差距,这可能会使从外部显而易见的事情对我来说不明显。非常感谢任何帮助。
答案 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