大熊猫数据帧合计计算

大熊猫数据帧合计计算

问题描述:

我有一个包含体育比赛一个大熊猫数据帧:大熊猫数据帧合计计算

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 /大熊猫十岁上下的方式做到这一点?任何关于此的提示都表示赞赏。

您可以使用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

对的方式做这件事:

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粘贴错误的版本。更新它。 –

你想要什么格式的结果?

一种简单的方式来计算的战绩是使用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}) 

不过,我更喜欢西蒙·吉本斯回答因为它不需要额外的模块。