使用 apply() 基于函数创建两列

Posted

技术标签:

【中文标题】使用 apply() 基于函数创建两列【英文标题】:create two columns based on a function with apply() 【发布时间】:2020-07-28 19:54:20 【问题描述】:

我有一个包含英超联赛足球数据的数据集:

    HomeTeam    AwayTeam         FTHG  FTAG
0   Liverpool   Norwich            4    1
1   West Ham    Man City           0    5
2   Bournemouth Sheffield United   1    1
3   Burnley     Southampton        3    0
... ...         ...               ...  ...

其中“FTHG”和“FTAG”分别是主队的全职进球和客队的进球。 我需要编写一个函数,根据结果(以数据框的形式)计算最终的英超联赛表。我写的是这个函数:

def calcScore(row):
    if PL_df.iloc[row]['FTHG'] > PL_df.iloc[row]['FTAG']: 
        x = 3
        y = 0
    elif PL_df.iloc[row]['FTHG'] < PL_df.iloc[row]['FTAG']:
        x = 0
        y = 3
    elif PL_df.iloc[row]['FTHG'] == PL_df.iloc[row]['FTAG']:
        x = 1
        y = 1
    return x,y

这有效,例如第一行它给出这个输出:

in[1]: calcScore(0)
out[1]: (3,0)

现在我需要使用 apply() 创建两列 HP 和 AP,分别包含主队和客队获得的积分数。但我想不出办法。

我希望我已经足够清楚了。提前谢谢你。

【问题讨论】:

【参考方案1】:

不需要函数(也比apply更快):

win_or_draws = df['FTHG'] > df['FTAG'], df['FTHG'] == df['FTAG']

df['HP'] = np.select( win_or_draws, (3,1), 0)
df['AP'] = np.select(win_or_draws, (0,1),3)

输出:

      HomeTeam          AwayTeam  FTHG  FTAG  HP  AP
0    Liverpool           Norwich     4     1   3   0
1     West Ham          Man City     0     5   0   3
2  Bournemouth  Sheffield United     1     1   1   1
3      Burnley       Southampton     3     0   3   0

【讨论】:

以上是关于使用 apply() 基于函数创建两列的主要内容,如果未能解决你的问题,请参考以下文章

pandas使用apply函数基于条件(if condition)生成新的数据列

pandas编写自定义函数使用apply函数应用自定义函数基于Series数据生成新的dataframe

基于其他两列并使用 LAG 函数更新 Oracle 过程中的列

pandas使用groupby函数基于指定分组变量对dataframe数据进行分组使用apply函数计算每个分组指定数值变量最小值所在的数据行(编写自定义函数其中使用nsmallest)

pandas使用groupby函数基于指定分组变量对dataframe数据进行分组使用apply函数计算每个分组指定数值变量最大值所在的数据行(编写自定义函数其中使用nlargest)

apply() 函数家族介绍