python - 在 Pandas 中,如何在 groupby.agg() 方法中应用 2 个自定义公式?

标签 python pandas grouping dataframe

我有这个 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/

相关文章:

Python 同时填充列表

python - 使用 Pyinstaller 编译 PyQt4 时出错

python - JIRA 标识符的正则表达式

python - 基于 4 元素列表索引从 Python 的 Pandas DataFrame 中添加特定概率

regex - 按其他节点值的模式分组的节点值求和

php - MySQL:按 x/按 y 分组表

python - 尝试使用 python 2 枚举/循环字母表、数字等

python - 当我设置 freq ="W"时,为什么输出变成 freq ="W-Sun"?

python - 如何根据pandas DataFrame中的说话者#将单词分组为句子

wpf - 分组的 CollectionView 的组可以水平呈现吗?