【发布时间】:2019-04-02 16:05:35
【问题描述】:
我有一个 csv 文件,其中包含来自不同足球比赛的大量结果。
数据类似于下面的示例。
result 列可以包含 3 个可能的值:
-
H-> 主队获胜(主队+3分) -
A-> 客队获胜(客场+3分) -
D-> 平局(两队都获得+1分)
HomeTeam AwayTeam Result
0 FC_Fake ABC_United H
1 Team_123 FC_Berlin A
2 FC_FAKE TEAM_123 D
我想更新文件,这样每一行都包含每支球队的总积分as they are at the start of the match(因此尚未更新该行本身的比赛结果)
我已使用以下代码更新数据框,使其包含每个团队的 points_[TEAM_NAME] 虚拟列。
# Teams is a python list I extracted earlier
for team in teams:
df['points_' + team] = 0
目标是转换数据框,使上面的例子变成下面的例子。
(同样,分数应该代表比赛开始时的情况。所以即使FC_FAKE在第一行赢得比赛,Points_FC_FAKE 列也是 0)
HomeTeam | AwayTeam | Result Points_FC_FAKE | Points_TEAM_123 | Points_FC_Berlin | etc
-------------------------------------------------------------------------------
FC_Fake ABC_United H 0 0 0
Team_123 FC_Berlin A 3 0 0
FC_FAKE Team_123 D 3 0 3
我创建了以下 python 函数,如果它遍历数据框中的所有行,则应该解析结果并将正确数量的积分奖励给正确的团队。
def point_updater(x):
if x['Result'] == 'H':
home = x['HomeTeam']
x.shift(-1)['points_' + home] += 3
return x
elif x['Result'] == 'A':
away = x['AwayTeam']
x.shift(-1)['points_' + away] += 3
return x
elif x['Result'] == 'D':
home = x['AwayTeam']
away = x['AwayTeam']
x.shift(-1)['points_' + home] += 1
x.shift(-1)['points_' + away] += 1
return x
问题是当我将此函数应用于数据框时,点不会改变(全部保持 0)
df = df.apply(point_counter, axis=1)
df['points_FC_Fake'].value_counts()
----
0 2691
有谁知道我做错了什么?
【问题讨论】:
-
所以每个团队都有一个新栏目?例如
FC_Berlin和ABC_United也会得到一个点列? -
正确! (我可能应该说得更清楚,我会更新问题)