我想用包含数据帧的一列或几列的签名定义自定义函数。
我试图复制文章“如何在多个列中使用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','发生在索引0')”,但是我停留在这个阶段,并且我不知道如何摆脱这个阻塞点。
答案 0 :(得分:3)
诀窍是完全删除lambda
。将您的 function 馈送到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)