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

时间:2018-12-29 00:11:11

标签: python python-3.x pandas dataframe apply

我想用包含数据帧的一列或几列的签名定义自定义函数。

我试图复制文章“如何在多个列中使用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')”,但是我停留在这个阶段,并且我不知道如何摆脱这个阻塞点。

1 个答案:

答案 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)