ALH*_*ALH 4 python group-by sum dataframe pandas
如何以不同的方式对正面和负面值进行求和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)})
Run Code Online (Sandbox Code Playgroud)
输出如下:
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
Run Code Online (Sandbox Code Playgroud)
我使用下面的代码得到否定:
df['negative'] = df.groupby('A')['C'].apply(lambda x: x[x<0].sum()).reset_index()]
Run Code Online (Sandbox Code Playgroud)
但问题是,当我想将它添加到其中一个dataframe列时,negative它会给出错误:
ValueError: Wrong number of items passed 2, placement implies 1
Run Code Online (Sandbox Code Playgroud)
我再次知道它所说的groupby已经返回了多个列并且无法分配它df['negatives']但我不知道如何解决这部分问题.我也需要积极的col.
期望的结果是:
A Positive Negative
0 foo 0.374156 -0.319699
1 bar 0.356339 -0.629649
Run Code Online (Sandbox Code Playgroud)
解决这个问题的正确方法是什么?
Nad*_*ham 10
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
Run Code Online (Sandbox Code Playgroud)
您可以groupby对A和进行操作df['C'] > 0,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
Run Code Online (Sandbox Code Playgroud)
该NaN值是因为所有A == bar行的 值为负C。
如果要将这些添加到与groupbykey 的值相对应的原始帧中,即A,则需要 left 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
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
6431 次 |
| 最近记录: |