如何在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_lcy | tran_amt_usd | client_id | tran_stat |
|---|---|---|---|
| 40 | 30 | 2001 | declined |
| 500 | 40 | 2033 | declined |
| 60 | 50 | 2045 | approved |
方法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
相关产品推荐
相关产品推荐

