You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在Pandas DataFrame中应用带双参数的自定义函数?报错求助

问题描述

尝试在Pandas DataFrame中应用带有两个参数的自定义函数但失败,代码如下:

import pandas as pd

df=pd.DataFrame({'tran_amt_lcy':[40,500,60],'tran_amt_usd':[30,40,50],'client_id':['2001','2033','2045']})

df.dtypes

def test_func(col1,col2):
    if col1>30 & col2<500:
        tran_status='approved'
    else:
        tran_status='declined'
    return tran_status

df['tran_stat']=df.apply(lambda x:test_func(df['tran_amt_usd'],df['tran_amt_lcy']),axis=1)

运行后报错:ValueError: The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all().

错误原因
  • 传参逻辑错误:在apply的lambda中,传入了整个df['tran_amt_usd']和df['tran_amt_lcy'](即完整的Series对象),而非当前行的单个数值。这导致test_func接收的是批量数据,执行col1>30这类比较后得到布尔Series,无法直接用于if判断,触发歧义错误。
  • 运算符使用错误:函数中用了&(按位与运算符),但针对单个数值的逻辑判断应使用and;&仅适用于Pandas向量级别的元素运算,且需要配合括号分组条件。
解决方法

方法1:修正apply传参与函数逻辑

调整lambda的传参方式,用x['列名']获取当前行对应值,同时修正逻辑运算符:

import pandas as pd

df=pd.DataFrame({'tran_amt_lcy':[40,500,60],'tran_amt_usd':[30,40,50],'client_id':['2001','2033','2045']})

def test_func(col1,col2):
    if col1>30 and col2<500:
        return 'approved'
    else:
        return 'declined'

# 传入当前行的列值而非整个Series
df['tran_stat']=df.apply(lambda x:test_func(x['tran_amt_usd'], x['tran_amt_lcy']), axis=1)

执行后生成的结果:

tran_amt_lcytran_amt_usdclient_idtran_stat
40302001declined
500402033declined
60502045approved

方法2:使用向量化操作(推荐,效率更高)

对于简单判断逻辑,避免用apply(逐行处理效率低),直接用Pandas向量运算实现:

import pandas as pd
import numpy as np

df=pd.DataFrame({'tran_amt_lcy':[40,500,60],'tran_amt_usd':[30,40,50],'client_id':['2001','2033','2045']})

# 向量级条件判断,&需配合括号分组
df['tran_stat'] = np.where(
    (df['tran_amt_usd']>30) & (df['tran_amt_lcy']<500),
    'approved',
    'declined'
)

该方式为批量处理,更适合大数据量场景。

内容的提问来源于stack exchange,提问作者Tony Tang

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.01 19:25:28