使用janitor的conditional_join多条件匹配时遇TypeError问题求助
问题:多条件匹配DataFrame数据时的janitor库报错排查
需求说明
根据以下三个条件,从Lookup_Table匹配Factor值到Dataset:
- State与State_Cd完全匹配
- Deductible完全匹配
- Revenue处于
Revenue_1 <= Revenue <= Revenue_2区间内
给定数据代码
Lookup_Table
Lookup_Table = {'State_Cd': ['TX','TX','TX','TX','CA','CA','CA','CA'], 'Deductible': [0,0,1000,1000,0,0,1000,1000], 'Revenue_1': [-99999999,25000000,-99999999,25000000,-99999999,25000000,-99999999,25000000], 'Revenue_2': [24999999,99000000,24999999,99000000,24999999,99000000,24999999,99000000], 'Factor': [0.15,0.25,0.2,0.3,0.11,0.15,0.13,0.45] } Lookup_Table = pd.DataFrame(Lookup_Table, columns = ['State_Cd','Deductible','Revenue_1','Revenue_2','Factor'])
Dataset
Dataset = {'Policy': ['A','B','C'], 'State': ['CA','TX','TX'], 'Deductible': [0,1000,0], 'Revenue': [10000000,30000000,1000000] } Dataset = pd.DataFrame(Dataset, columns = ['Policy','State','Deductible','Revenue'])
期望输出
Policy State Deductible Revenue Factor 0 A CA 0 10000000 0.11 1 B TX 1000 30000000 0.30 2 C TX 0 1000000 0.15
尝试代码及报错
尝试的janitor实现代码
import janitor Data_Final = (Dataset.conditional_join(Lookup_Table, # 元组格式:左表列名, 右表列名, 比较运算符 ('Revenue', 'Revenue_1', '>='), ('Revenue', 'Revenue_2', '<='), ('State', 'State_Cd', '=='), ('Deductible', 'Deductible', '=='), how = 'left',sort_by_appearance = False ))
错误信息
TypeError: __init__() got an unexpected keyword argument 'copy'
错误原因及解决方法
错误原因:该报错源于janitor版本与当前pandas版本不兼容。janitor的
conditional_join方法内部调用pandas接口时传递了copy参数,但你的pandas版本对应的方法不支持该参数,因此触发类型错误。解决方法:
- 版本适配:
- 升级pandas到支持
copy参数的版本(推荐pandas>=1.3.0),或降级janitor到与当前pandas兼容的版本,执行以下命令即可:# 升级pandas pip install --upgrade pandas # 或降级janitor到兼容版本(如0.24.0) pip install janitor==0.24.0
- 升级pandas到支持
- 无依赖替代方案:
如果不想调整库版本,可以用pandas原生方法实现需求,先通过merge匹配等值条件,再过滤区间条件:
该方法同样能得到符合要求的结果,且无需依赖janitor库。# 先匹配State和Deductible等值条件 merged = Dataset.merge(Lookup_Table, left_on=['State', 'Deductible'], right_on=['State_Cd', 'Deductible'], how='left') # 过滤Revenue处于目标区间的行 Data_Final = merged[(merged['Revenue'] >= merged['Revenue_1']) & (merged['Revenue'] <= merged['Revenue_2'])].drop(columns=['State_Cd', 'Revenue_1', 'Revenue_2'])
- 版本适配:
内容的提问来源于stack exchange,提问作者Bustergun
相关产品推荐
相关产品推荐

