Python 使用.apply()定义要在数据帧上使用的函数
我想用包含一列或几列数据帧的签名来定义自定义函数 我试图复制“如何将Pandas‘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
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”一样使用它)。所以,即使这不完全符合礼仪。。。谢谢你。