如何在pandas中使用groupby计算绝对值的总和?

10

如何在pandas中使用groupby计算绝对值之和?

例如,给定以下DataFrame:

    Player  Score
0      A    100
1      B   -150
2      A   -110
3      B    180
4      B    125

我想要得到选手A的总分数(100+110=210),以及忽略分数符号后,选手B的总分数(150+180+125=455)。

我可以使用以下代码来计算总和:

import pandas as pd
import numpy as np

frame = pd.DataFrame({'Player' : ['A', 'B', 'A', 'B', 'B'], 
                      'Score'  : [100, -150, -110, 180, 125]})

print('frame: {0}'.format(frame))

total_scores = frame[['Player','Score']].groupby(['Player']).agg(['sum'])

print('total_scores: {0}'.format(total_scores))

但是我怎么能用groupby计算绝对值之和呢?

frame[['Player','Score']].abs().groupby(['Player']).agg(['sum']) 不出所料地返回:

Traceback (most recent call last):
  File "O:\tests\absolute_count.py", line 10, in <module>
    total_scores = frame[['Player','Score']].abs().groupby(['Player']).agg(['sum'])
  File "C:\Users\dernoncourt\AppData\Local\Continuum\Anaconda3\lib\site-packages\pandas\core\generic.py", line 5518, in abs
    return np.abs(self)
TypeError: bad operand type for abs(): 'str'

我不想修改DataFrame。

2个回答

21

你可以应用一个取绝对值并相加的函数:

>>> frame.groupby('Player').Score.apply(lambda c: c.abs().sum())
Player
A    210
B    455
Name: Score, dtype: int64

你可以创建一个新列,其中包含绝对值,然后对该列求和:

>>> frame.assign(AbsScore=frame.Score.abs()).groupby('Player').AbsScore.sum()
Player
A    210
B    455
Name: AbsScore, dtype: int64

6
您可以使用DataFrameGroupBy.apply和lambda函数:
In [326]: df.groupby('Player').Score.apply(lambda x: np.sum(np.abs(x)))
Out[326]: 
Player
A    210
B    455
Name: Score, dtype: int64

要获取Player列,请使用df.reset_index
In [371]: df.groupby('Player').Score.apply(lambda x: np.sum(np.abs(x))).reset_index()
Out[371]: 
  Player  Score
0      A    210
1      B    455

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接