使用 .apply() 定义要在 DataFrame 上使用的函数

我想定义带有签名的自定义函数,其中包含数据帧的一列或几列。


我试图复制文章“如何将 Pandas 'apply' 函数用于多列?”中提到的解决方案,但我无法理解需要设置函数以接受来自其他列的数据作为输入的方式。


我的代码示例:


import pandas as pd


df=pd.DataFrame({'NAME':['A','B','C','D'],'HOURS':[38, 52, 1040, 28],'ROLE':['Manager','Expert','Expert','Expert']})


def apply_rate(col1='HOURS', col2='ROLE'):

    if row[col2]=='Manager': return row[col1]*165

    else: return row[col1]*135


df['TOTAL']=df.apply(lambda row: apply_rate(row['HOURS'],row['ROLE']),axis=1)

我收到一条消息“KeyError: ('Manager', 'occurred at index 0')”,但我卡在这个阶段,我不知道如何摆脱这个阻塞点。


吃鸡游戏
浏览 314回答 1
1回答

隔江千里

诀窍是lambda完全删除。将您的函数提供给,pd.DataFrame.apply并可能将您的附加函数参数apply直接提供给:def apply_rate(row, col1, col2):    if row[col2]=='Manager': return row[col1]*165    else: return row[col1]*135df['TOTAL'] = df.apply(apply_rate, axis=1, col1='HOURS', col2='ROLE')print(df)  NAME  HOURS     ROLE   TOTAL0    A     38  Manager    62701    B     52   Expert    70202    C   1040   Expert  1404003    D     28   Expert    3780但是,逐行操作效率低下,不推荐使用 Pandas。您可以使用按列操作轻松矢量化您的算法:df['TOTAL'] = df['HOURS'] * np.where(df['ROLE'] == 'Manager', 165, 135)另一种更容易扩展的版本可以使用字典映射:factor_map = {'Manager': 165}df['TOTAL'] = df['HOURS'] * df['ROLE'].map(factor_map).fillna(135)
打开App,查看更多内容
随时随地看视频慕课网APP

相关分类

Python