2017-07-30 13 views
2

パンダのグループバイとの絶対合計を計算するにはどうしたらいいですか?例えばパンダのグループバイとの絶対合計を計算するにはどうしたらいいですか?

、データフレーム所与:私はプレーヤーAの合計スコア(100 + 110 = 210)だけでなく、プレイヤーA(150 + 180 +についての総スコアを持っていると思い

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

を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' 

私はデータフレームを変更する必要はありません。

あなたがラムダで DataFrameGroupBy.applyを使用することができます

答えて

4

あなたは絶対値を取り、それを合計する関数を適用することができ:

>>> 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 
1

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 
+1

ちょうど質問です:「np.abs」で 'np.absolute'を使う理由は何ですか? –

+2

@JonasAdler特に理由はありません... –

関連する問題