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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.06 08:28:31