pandas数据帧聚合计算

时间:2015-05-14 10:57:17

标签: python pandas dataframe

我有一个包含体育比赛的pandas数据框:

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

但我确信有更多的pythonic / pandas-ish方法可以做到这一点?任何关于此的提示都表示赞赏。

3 个答案:

答案 0 :(得分: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

答案 1 :(得分: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

全部在一行:

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

答案 2 :(得分: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})

尽管如此,我更喜欢Simon Gibbons的回答,因为它不需要额外的模块。