pandas 数据框聚合计算
pandas dataframe aggregate calculation
我有一个包含体育比赛的 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 方法可以做到这一点?对此的任何提示表示赞赏。
您可以将 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
进行中:
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
您希望结果采用哪种格式?
计算输赢的简单方法是使用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 上面的回答,因为它不需要额外的模块。
我有一个包含体育比赛的 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 方法可以做到这一点?对此的任何提示表示赞赏。
您可以将 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
进行中:
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
您希望结果采用哪种格式?
计算输赢的简单方法是使用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 上面的回答,因为它不需要额外的模块。