为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

吃鸡游戏 2021-09-28 15:30:11
我想定义带有签名的自定义函数,其中包含数据帧的一列或几列。我试图复制文章“如何将 Pandas 'apply' 函数用于多列?”中提到的解决方案,但我无法理解需要设置函数以接受来自其他列的数据作为输入的方式。我的代码示例:import pandas as pddf=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]*135df['TOTAL']=df.apply(lambda row: apply_rate(row['HOURS'],row['ROLE']),axis=1)我收到一条消息“KeyError: ('Manager', 'occurred at index 0')”,但我卡在这个阶段,我不知道如何摆脱这个阻塞点。
查看完整描述

1 回答

?
隔江千里

TA贡献1906条经验 获得超10个赞

诀窍是lambda完全删除。将您的函数提供给,pd.DataFrame.apply并可能将您的附加函数参数apply直接提供给:


def apply_rate(row, col1, col2):

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

    else: return row[col1]*135


df['TOTAL'] = df.apply(apply_rate, axis=1, col1='HOURS', col2='ROLE')


print(df)


  NAME  HOURS     ROLE   TOTAL

0    A     38  Manager    6270

1    B     52   Expert    7020

2    C   1040   Expert  140400

3    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)


查看完整回答
反对 回复 2021-09-28
  • 1 回答
  • 0 关注
  • 313 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号