我有一个足球比赛结果的数据框,正在尝试在数据框的末尾添加一个新列,以显示获胜球队。我正在尝试使用df.apply
执行此操作。这是我到目前为止所拥有的:
def match_winner(winner,home_team,away_team,home_goals,away_goals):
if home_goals>away_goals:
winner = home_team
elif home_goals<away_goals:
winner = away_team
else:
winner = "None"
match['Winning Team'] =""
match['Winning Team'].apply(match_winner,args=[match['Home Team'],match['Away Team'],match['home_team_goal'],match['away_team_goal']])
这是match
数据帧的结构:
<bound method DataFrame.info of id country_id league_id season stage date \
145 146 1 1 2008/2009 24 2009-02-27 00:00:00
153 154 1 1 2008/2009 25 2009-03-08 00:00:00
155 156 1 1 2008/2009 25 2009-03-07 00:00:00
162 163 1 1 2008/2009 26 2009-03-13 00:00:00
168 169 1 1 2008/2009 26 2009-03-14 00:00:00
... ... ... ... ... ... ...
25972 25973 24558 24558 2015/2016 8 2015-09-13 00:00:00
25974 25975 24558 24558 2015/2016 9 2015-09-22 00:00:00
25975 25976 24558 24558 2015/2016 9 2015-09-23 00:00:00
25976 25977 24558 24558 2015/2016 9 2015-09-23 00:00:00
25978 25979 24558 24558 2015/2016 9 2015-09-23 00:00:00
match_api_id home_team_api_id away_team_api_id home_team_goal \
145 493017 8203 9987 2
153 493025 9984 8342 1
155 493027 8635 10000 2
162 493034 8203 8635 2
168 493040 10000 9999 0
... ... ... ... ...
25972 1992089 10243 10191 3
25974 1992091 10190 10191 1
25975 1992092 9824 10199 1
25976 1992093 9956 10179 2
25978 1992095 10192 9931 4
away_team_goal goal shoton shotoff foulcommit card cross corner \
145 1 None None None None None None None
153 3 None None None None None None None
155 0 None None None None None None None
162 1 None None None None None None None
168 0 None None None None None None None
... ... ... ... ... ... ... ... ...
25972 3 None None None None None None None
25974 0 None None None None None None None
25975 2 None None None None None None None
25976 0 None None None None None None None
25978 3 None None None None None None None
possession BSA Home Team Away Team \
145 None 2.25 KV Mechelen KRC Genk
153 None 2.38 KSV Cercle Brugge Club Brugge KV
155 None 7.00 RSC Anderlecht SV Zulte-Waregem
162 None 1.75 KV Mechelen RSC Anderlecht
168 None 4.33 SV Zulte-Waregem KSV Roeselare
... ... ... ... ...
25972 None NaN FC Zürich FC Thun
25974 None NaN FC St. Gallen FC Thun
25975 None NaN FC Vaduz FC Luzern
25976 None NaN Grasshopper Club Zürich FC Sion
25978 None NaN BSC Young Boys FC Basel
League Country home_player_1 home_player_2 \
145 Belgium Jupiler League Belgium False False
153 Belgium Jupiler League Belgium False False
155 Belgium Jupiler League Belgium False False
162 Belgium Jupiler League Belgium False False
168 Belgium Jupiler League Belgium False False
... ... ... ... ...
25972 Switzerland Super League Switzerland False False
25974 Switzerland Super League Switzerland False False
25975 Switzerland Super League Switzerland False False
25976 Switzerland Super League Switzerland False False
25978 Switzerland Super League Switzerland False False
home_player_3 home_player_4 home_player_5 home_player_6 \
145 False False False False
153 False False False False
155 False False False False
162 False False False False
168 False False False False
... ... ... ... ...
25972 False False False False
25974 False False False False
25975 False False False False
25976 False False False False
25978 False False False False
home_player_7 home_player_8 home_player_9 home_player_10 \
145 False False False False
153 False False False False
155 False False False False
162 False False False False
168 False False False False
... ... ... ... ...
25972 False False False False
25974 False False False False
25975 False False False False
25976 False False False False
25978 False False False False
home_player_11 away_player_1 away_player_2 away_player_3 \
145 False False False False
153 False False False False
155 False False False False
162 False False False False
168 False False False False
... ... ... ... ...
25972 False False False False
25974 False False False False
25975 False False False False
25976 False False False False
25978 False False False False
away_player_4 away_player_5 away_player_6 away_player_7 \
145 False False False False
153 False False False False
155 False False False False
162 False False False False
168 False False False False
... ... ... ... ...
25972 False False False False
25974 False False False False
25975 False False False False
25976 False False False False
25978 False False False False
away_player_8 away_player_9 away_player_10 away_player_11 \
145 False False False False
153 False False False False
155 False False False False
162 False False False False
168 False False False False
... ... ... ... ...
25972 False False False False
25974 False False False False
25975 False False False False
25976 False False False False
25978 False False False False
Winning Team
145
153
155
162
168
... ...
25972
25974
25975
25976
25978
[21374 rows x 47 columns]>
我需要发送多列作为输入论据,以便找出谁获胜,但是我不确定.apply()
是否允许您将系列作为参数传递?是否可以使用.apply()
执行此操作。如果这样的话,一个解决方案将是有帮助的,但是如果有人知道更好的替代方案,那也将是有用的。
避免DataFrame.apply
(通常作为隐藏循环运行,而是考虑在列上使用numpy.where
的嵌套条件逻辑:
match['Winning Team'] = np.where(match['home_team_goal'] > match['away_team_goal'],
match['Home Team'],
np.where(match['home_team_goal'] < match['away_team_goal']
match['Away Team'],
np.nan
)
)
用途:
match = pd.DataFrame({
'Home Team':list('abcdef'),
'Away Team':list('ghijkl'),
'home_team_goal':[14,5,4,5,5,4],
'away_team_goal':[7,8,2,4,8,4],
})
print (match)
m1 = match.home_team_goal>match.away_team_goal
m2 = match.home_team_goal<match.away_team_goal
match['winner'] = np.select([m1, m2], [match['Home Team'], match['Home Team']], default=None)
print (match)
Home Team Away Team home_team_goal away_team_goal winner
0 a g 14 7 a
1 b h 5 8 b
2 c i 4 2 c
3 d j 5 4 d
4 e k 5 8 e
5 f l 4 4 None