如果没有for循环,应用将无法正常工作,如何在DataFrame上进行迭代?

时间:2018-07-30 04:52:05

标签: python pandas chaining

我正在尝试找到最佳方法,以在不使用iterrows()itertuples()的情况下将函数应用于熊猫DataFrame的每一行。请注意,我很确定apply()在这种情况下将无法工作。

这是我正在使用的DataFrame的前5行:

In [2470]: home_df.head()
Out[2470]: 
   GameId  GameId_real       team  FTHG  FTAG  homeElo  awayElo  homeGame  
0       0           -1   Charlton   1.0   2.0   1500.0   1500.0         1   
1       1           -1      Derby   2.0   1.0   1500.0   1500.0         1   
2       2           -1      Leeds   2.0   0.0   1500.0   1500.0         1   
3       3           -1  Leicester   0.0   5.0   1500.0   1500.0         1   
4       4           -1  Liverpool   2.0   1.0   1500.0   1500.0         1   

这是我的功能和当前使用的代码:

def wt_goals_elo(df, game_id_row, team_row):
    wt_goals = (df[(df.GameId < game_id_row) & (df.team == team_row)]
                  .pipe(lambda df: 
                        (df.awayElo * df.FTHG).sum() / df.awayElo.sum()))
    return wt_goals

game_id_idx = home_df.columns.get_loc('GameId')
team_idx = home_df.columns.get_loc('team')

wt_goals = [wt_goals_elo(home_df, row[game_id_idx + 1], row[team_idx + 1]) for row in home_df.itertuples()]

FTHG =全职主场进球。 我基本上是在尝试找到全时主场进球的加权平均值,并按前一场比赛的客场elo加权。我可以使用for循环来执行此操作,但不能使用apply来执行此操作,因为我需要引用原始DataFrame来按GameId和team进行过滤。 有任何想法吗? 提前非常感谢。

1 个答案:

答案 0 :(得分:0)

我认为需要:

def wt_goals_elo(game_id_row, team_row):
    print (game_id_row)
    wt_goals = (home_df[(home_df.GameId.shift() < game_id_row) & 
               (home_df.team.shift() == team_row)]
                  .pipe(lambda df: 
                        (df.awayElo * df.FTHG).sum() / df.awayElo.sum()))
    return wt_goals


home_df['w'] = home_df.apply(lambda x: wt_goals_elo(x['GameId'], x['team']), axis=1)