在pandas数据框上使用apply(),并以其他数据框列作为输入

问题描述 投票:0回答:2

我有一个足球比赛结果的数据框,正在尝试在数据框的末尾添加一个新列,以显示获胜球队。我正在尝试使用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()执行此操作。如果这样的话,一个解决方案将是有帮助的,但是如果有人知道更好的替代方案,那也将是有用的。

python pandas dataframe series
2个回答
0
投票

避免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
                                         )
                                )

0
投票

用途:

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
© www.soinside.com 2019 - 2024. All rights reserved.