在pandas中使用groupby时,如何将负值和正值分别求和?[英] How to sum negative and positive values separately when using groupby in pandas?

本文是小编为大家收集整理的关于在pandas中使用groupby时,如何将负值和正值分别求和?的处理方法,想解了在pandas中使用groupby时,如何将负值和正值分别求和?的问题怎么解决?在pandas中使用groupby时,如何将负值和正值分别求和?问题的解决办法?那么可以参考本文帮助大家快速定位并解决问题。

问题描述

pandas中如何将正值和负值汇总在一起,然后将它们放在positive和negative列中?

我有以下数据框架:

df = pandas.DataFrame({'A' : ['foo', 'bar', 'foo', 'bar', 'foo', 'bar', 'foo', 'foo'],
                   'B' : ['one', 'one', 'two', 'three', 'two', 'two', 'one', 'three'],
                   'C' : np.random.randn(8), 'D' : np.random.randn(8)})

输出如下:

df
     A      B         C         D
0  foo    one  0.374156  0.319699
1  bar    one -0.356339 -0.629649
2  foo    two -0.390243 -1.387909
3  bar  three -0.783435 -0.959699
4  foo    two -1.268622 -0.250871
5  bar    two -2.302525 -1.295991
6  foo    one -0.968840  1.247675
7  foo  three  0.482845  1.004697

我使用以下代码获得负面因素:

df['negative'] = df.groupby('A')['C'].apply(lambda x: x[x<0].sum()).reset_index()]

但是问题是我想将其添加到称为negative的dataframe列之一中,它给出了错误:

ValueError: Wrong number of items passed 2, placement implies 1

再次,我知道groupby已经返回了多个列,无法将其分配给df['negatives'],但我不知道如何解决问题的这一部分.我也需要有正面的col.

所需的结果将是:

    A      Positive   Negative
0  foo     0.374156  -0.319699
1  bar     0.356339  -0.629649

解决问题的正确解决方案是什么?

推荐答案

In [14]:
df.groupby(df['A'])['C'].agg([('negative' , lambda x : x[x < 0].sum()) , ('positive' , lambda x : x[x > 0].sum())])
Out[14]:
     negative   positive
A       
bar -1.418788   2.603452
foo -0.504695   2.880512

其他推荐答案

您可以在A和df['C'] > 0上groupby和 unstack 结果:

>>> right = df.groupby(['A', df['C'] > 0])['C'].sum().unstack()
>>> right = right.rename(columns={True:'positive', False:'negative'})
>>> right
C    negative  positive
A                      
bar   -3.4423       NaN
foo   -2.6277     0.857

NaN值是因为所有A == bar行都为C的负值.

如果要将它们添加到对应于groupby键的值的原始帧中,即A,则需要左 join :

>>> df.join(right, on='A', how='left')
     A      B       C       D  negative  positive
0  foo    one  0.3742  0.3197   -2.6277     0.857
1  bar    one -0.3563 -0.6296   -3.4423       NaN
2  foo    two -0.3902 -1.3879   -2.6277     0.857
3  bar  three -0.7834 -0.9597   -3.4423       NaN
4  foo    two -1.2686 -0.2509   -2.6277     0.857
5  bar    two -2.3025 -1.2960   -3.4423       NaN
6  foo    one -0.9688  1.2477   -2.6277     0.857
7  foo  three  0.4828  1.0047   -2.6277     0.857

本文地址:https://www.itbaoku.cn/post/1727988.html