Python 使用.apply()定义要在数据帧上使用的函数

Python 使用.apply()定义要在数据帧上使用的函数,python,python-3.x,pandas,dataframe,apply,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 app

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

我试图复制“如何将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','occurrentedatindex 0')”,但我仍停留在这个阶段,不知道如何摆脱这个阻塞点

诀窍是将
lambda
一起删除。将您的函数提供给,并可能将您的附加函数参数直接提供给
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)

这真是一个很好的答案。很明显,这让我走出了死胡同。毫无疑问,它是有用的(我真的很喜欢“.fillna(135)”-在本例中,我从未想过像“else”一样使用它)。所以,即使这不完全符合礼仪。。。谢谢你。