2015-05-14 161 views
2

我有一個包含體育比賽一個大熊貓數據幀:大熊貓數據幀合計計算

Winner  Loser   
A   B 
B   A 
A   C 

我想爲每一個玩家的輸贏統計(即A,B,和C)。所以對於A來說結果應該是2-1。對於B應該是1-1,對於C應該是0-1。

我知道如何通過迭代行由行過與數據框計算這個

for index, match in df.iterrows(): 
    //code for calculating win-loss here 

,但我相信,有一個更Python /大熊貓十歲上下的方式做到這一點?任何關於此的提示都表示讚賞。

回答

2

您可以使用groupby方法與size骨料例如

print df.groupby('Loser').size() 

做到這一點

會產生與損失數的計數一個數據幀。

Loser 
A   1 
B   1 
C   1 
dtype: int64 

然後,您可以將其組合到如下的分數計數(使用fillna方法來設置默認值,如果一支球隊沒有勝或負)

wins = df.groupby('Winner').size() 
losses = df.groupby('Loser').size() 

scores = pd.DataFrame({'Wins' : wins, 'Losses' : losses}).fillna(0) 

得到最終得分算作

Losses Wins 
A  1  2 
B  1  1 
C  1  0 
+0

謝謝。完美解決方案現在我只想通過改變勝負列來美化它。 – beta

+1

在上面的評論中回答我的問題。這工作:'scores = scores.reindex_axis(['wins','loss'],axis = 1)' – beta

1

對的方式做這件事:

win = df.groupby('Winner').count() 
los = df.groupby('Loser').count() 
score = pd.DataFrame([win.Loser, los.Winner]) 
score 

給出:

 A B C 
Loser 2 1 0 
Winner 1 1 1 

和:

score.T 

顯示它轉置:

Loser Winner 
A 2  1 
B 1  1 
C 0  1 

這是上面所用的數據幀:

df = pd.DataFrame({'Winner': list('ABA'), 
        'Loser': list('BAC')}) 

df 

    Loser Winner 
0 B  A 
1 A  B 
2 C  A 

鋁l在一個行:

pd.DataFrame([df.groupby('Winner').count().Loser, 
       df.groupby('Loser').count().Winner]).fillna(0).T 

結果:

Loser Winner 
A 2  1 
B 1  1 
C 0  1 
+0

hm。代碼似乎卡在「los = df.groupby('Loser')。count()」? – beta

+0

@beta粘貼錯誤的版本。更新它。 –

0

你想要什麼格式的結果?

一種簡單的方式來計算的戰績是使用collections.Counter:

import pandas as pd 
from collections import Counter 

df=pd.DataFrame([['A','B'],['B','C'],['A','C']], columns=['winner','loser']) 

win_counts = Counter(df['winner']) 

win_counts是類似下面的字典:

Counter({'A': 2, 'B': 1}) 

不過,我更喜歡西蒙·吉本斯回答因爲它不需要額外的模塊。