我有这个 df:
A = pd.DataFrame([['Big', -2, 4, 1, 0], ['Medium', 4, 4, -1, -1], ['Big', 3, -3, -2, -1], ['Small', 0, -1, -3, 5], ['Small', 1, 4, -2, 5]],
columns=['A', 'B', 'C', 'D', 'E'], index=[1, 2, 3, 4, 5])
我想按 A 分组,并对其他列进行计算(“平均值”、“标准差”和两个自定义)。自定义函数仅计算 >= 0 的元素以及 < 0 的元素。这将是输出:
A
Big Medium Small
mean std Up Down mean std Up Down mean std Up Down
B 0.50 3.53 1 1 4 Nan 1 0 0.50 0.70 2 0
C 0.50 4.94 1 1 4 Nan 1 0 1.50 3.53 1 1
D -0.50 2.12 1 1 -1 Nan 0 1 -2.50 0.70 0 2
E -0.25 0.70 1 1 -1 Nan 0 1 5.00 0.0 2 0
注意:显示屏不必是这种形状,重要的是它包含我需要的所有信息。
到目前为止我已经得到了这个
f = ['mean', 'std']
A.groupby(A['A']).agg(f)
B C D E
mean std mean std mean std mean std
A
Big 0.5 3.535534 0.5 4.949747 -0.5 2.121320 -0.5 0.707107
Medium 4.0 NaN 4.0 NaN -1.0 NaN -1.0 NaN
Small 0.5 0.707107 1.5 3.535534 -2.5 0.707107 5.0 0.000000
我被其他两个函数困住了,我尝试做自定义公式
function = ['mean', 'std', (lambda x: x >= 0).sum(), (lambda y: y < 0).sum()]
但我得到:
AttributeError: 'function' object has no attribute 'sum'
谢谢
最佳答案
In [17]: def up(x):
return (x>=0).sum()
....:
In [18]: def down(x):
return (x<0).sum()
....:
In [19]: f = ['mean', 'std', up, down]
In [20]: A.groupby(A['A']).agg(f)
Out[20]:
B C D \
mean std up down mean std up down mean std
A
Big 0.5 3.535534 1 1 0.5 4.949747 1 1 -0.5 2.121320
Medium 4.0 NaN 1 0 4.0 NaN 1 0 -1.0 NaN
Small 0.5 0.707107 2 0 1.5 3.535534 1 1 -2.5 0.707107
E
up down mean std up down
A
Big 1 1 -0.5 0.707107 1 1
Medium 0 1 -1.0 NaN 0 1
Small 0 2 5.0 0.000000 2 0
您有两个问题:
首先,您将括号放在错误的位置:(lambda x: x >= 0).sum()
应该是 lambda x: (x >= 0 ).sum()
.
第二个是 pandas 试图从聚合函数的名称中找出 agg()
的列名称,因此如果您尝试将两个 lambda 函数传递给agg(),你会得到一个错误。将它们定义为函数可以解决这个问题(正如我上面所说的)。
关于python - 在 Pandas 中,如何在 groupby.agg() 方法中应用 2 个自定义公式?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26351990/