使用left_on/right_on合并DataFrame报KeyError: 'CID'的原因排查
KeyError: 'CID' 问题分析与解决
问题根源
你的csvReader函数逻辑存在错误:
- 当传入多个列参数(比如
'course_id', 'course_name', 'fee')时,函数会把第一个参数'course_id'设为index_col(即DataFrame的索引列),而非普通数据列。 - 这导致
courseFee的'course_id'是索引而非数据列,后续执行courseFee.rename(columns={'course_id': 'CID'}, inplace=True)时,因为找不到名为'course_id'的列,rename操作完全无效。 - 最终
pd.merge指定left_on='CID'时,自然找不到该列,抛出KeyError。
解决方案
方法1:修正csvReader函数逻辑
调整函数,让索引列的设置更可控,避免默认把第一个列设为索引:
def csvReader(fileName, delimiter, usecols, index_col=None): return pd.read_csv(fileName, usecols=usecols, index_col=index_col, sep=delimiter) # 调用时明确不设置索引,让course_id作为普通列存在 courseFee = csvReader(courseFeeScr, ';', ['course_id', 'course_name', 'fee'])
此时'course_id'是普通数据列,后续的rename操作会正常生效,原merge代码无需修改。
方法2:直接利用索引合并
既然courseFee的索引就是原course_id,可以跳过列名修改,直接通过索引关联:
# 删除无效的rename代码 # courseFee.rename(columns={'course_id': 'CID'}, inplace=True) # 用left_index=True关联courseFee的索引和febReg的course_id列 joinTwo = pd.merge(courseFee, febReg, left_index=True, right_on='course_id')
方法3:将索引转为列后再重命名
如果一定要保留列名修改的逻辑,先把索引转为普通列:
# 把courseFee的索引(原course_id)转为数据列 courseFee.reset_index(inplace=True) # 现在可以正常重命名列 courseFee.rename(columns={'course_id': 'CID'}, inplace=True) # 执行合并 joinTwo = pd.merge(courseFee, febReg, left_on='CID', right_on='course_id')
内容的提问来源于stack exchange,提问作者doughstone
相关产品推荐
相关产品推荐

