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

使用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版本对应的方法不支持该参数,因此触发类型错误。

  • 解决方法:

    1. 版本适配:
      • 升级pandas到支持copy参数的版本(推荐pandas>=1.3.0),或降级janitor到与当前pandas兼容的版本,执行以下命令即可:
        # 升级pandas
        pip install --upgrade pandas
        # 或降级janitor到兼容版本(如0.24.0)
        pip install janitor==0.24.0
        
    2. 无依赖替代方案:
      如果不想调整库版本,可以用pandas原生方法实现需求,先通过merge匹配等值条件,再过滤区间条件:
      # 先匹配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'])
      
      该方法同样能得到符合要求的结果,且无需依赖janitor库。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 16:25:30