在 pandas 中的多个列上应用自定义函数
Posted
技术标签:
【中文标题】在 pandas 中的多个列上应用自定义函数【英文标题】:Apply custom function over multiple columns in pandas 【发布时间】:2018-05-02 12:10:05 【问题描述】:我在 Pandas 中“应用”自定义函数时遇到问题。当我测试该函数时,直接传递它工作的值并正确返回响应。但是,当我尝试以这种方式传递列值时
def feez (rides, plan):
pmt4 = 200
inc4 = 50 #number rides included
min_rate4 = 4
if plan == "4 Plan":
if rides > inc4:
fee = ((rides - inc4) * min_rate4) + pmt4
else:
fee = pmt4
return (fee)
else:
return 0.1
df['fee'].apply(feez(df.total_rides, df.plan_name))
我收到错误:
"The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all()."
直接传递值有效,即feez (800, "4 Plan")
,返回3200
但是,当我尝试应用上述功能时收到错误消息。
我是新手,怀疑我的语法写得不好。任何想法都非常感谢。 TIA。以利
【问题讨论】:
该问题阐明了应用将某些列值作为参数的函数的必要性。 lambda 函数有助于对与数据帧的每一行x
相关的列值进行子集化。
【参考方案1】:
apply
旨在一次处理一行,因此在您这样做时传递整列是行不通的。在这些情况下,最好使用lambda
。
df['fee'] = df.apply(lambda x: feez(x['total_rides'], x['plan_name']), axis=1)
但是,可能有更快的方法来执行此操作。一种方法是使用np.vectorize
。另一个是使用np.where
。
选项 1np.vectorize
v = np.vectorize(feez)
df['fee'] = v(df.total_rides, df.plan_name)
选项 2
嵌套np.where
df['fee'] = np.where(
df.plan_name == "4 Plan",
np.where(df.total_rides > inc4, (df.total_rides - inc4) * min_rate4) + pmt4, pmt4),
0.1
)
【讨论】:
Lambda 抛出错误,如果你知道为什么会很感兴趣吗?文件“C:\Users\runner\Anaconda3\lib\site-packages\pandas\core\frame.py”,第 4950 行,在 _apply_standard 结果[i] = func(v) 文件“以上是关于在 pandas 中的多个列上应用自定义函数的主要内容,如果未能解决你的问题,请参考以下文章
pandas编写自定义函数计算多个数据列的加和(sum)使用groupby函数和apply函数聚合计算分组内多个数据列的加和
使用自定义名称将多个pandas DataFrame输出为CSV
Pandas:自定义 WMAPE 函数聚合函数到多列而没有 for 循环?
应用自定义 groupby 聚合函数在 pandas python 中输出二进制结果
pandas编写自定义函数高亮显示(highlight)dataframe中的指定内容(数值)(highlighting a specific values or content of a panda