我有这个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分组,并在其他列上进行计算('表示',' std'和两个自定义)。自定义函数仅计算> = 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'
由于
答案 0 :(得分:2)
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(),你会收到错误。将它们定义为函数解决了这个问题(正如我上面所述)。