在 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) 文件“",第 1 行,在 gett['fee'] = gett.apply(lambda x:feez(x['total_rides'], x['plan_name'])) 文件“C:\Users\runner\ Anaconda3\lib\site-packages\pandas\core\series.py",第 623 行,在 getitem 结果 = self.index.get_value(self, key) 我在 lamdba 解决方案中添加了“axis = 1”参数,它也可以工作。再次感谢您的澄清和想法。 @eli 是的,我的错,我错过了那个论点。效果很好。

以上是关于在 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

在 Oracle apex 中的列上设置自定义验证