合并DataFrame时出现plant_name列KeyError的问题求助
合并DataFrame时出现
KeyError('plant_name')的排查与解决 问题背景
两个DataFrame(coeff和ncDatam)均显示包含plant_name列,但执行merge操作按该列合并时触发KeyError。
相关数据信息
coeff列信息与数据:
coeff.columns Out[66]: Index(['plant_name', 'slopex', 'intercept'], dtype='object') coeff.head(5) Out[67]: plant_name slopex intercept 0 BII NEE STIPA 1.095434 -1278.741489 1 DOS ARBOLITOS 1.161407 -3438.054141 2 PIER B 0.819827 3352.473727 3 PIER II 0.906328 903.044250 4 PIER IV 0.987371 4850.368353
ncDatam列信息与数据:
ncDatam.columns Out[63]: Index(['plant_name', 'year', 'month', 'power_kwh'], dtype='object') ncDatam.head(5) Out[68]: plant_name year month power_kwh 0 BII NEE STIPA 1991 1 11905.83 1 BII NEE STIPA 1991 2 15084.93 2 BII NEE STIPA 1991 3 7823.63 3 BII NEE STIPA 1991 4 4417.25 4 BII NEE STIPA 1991 5 2987.07
合并报错信息:
df = ncDatam.merge(coeff, on='plant_name') Traceback (most recent call last): File "<ipython-input-69-9cba791972e8>", line 1, in <module> df = ncDatam.merge(coeff, on='plant_name') File "C:\Users\U321103\Anaconda3\envs\Stats\lib\site-packages\pandas\core\frame.py", line 7297, in merge validate=validate, File "C:\Users\U321103\Anaconda3\envs\Stats\lib\site-packages\pandas\core\reshape\merge.py", line 86, in merge validate=validate, File "C:\Users\U321103\Anaconda3\envs\Stats\lib\site-packages\pandas\core\reshape\merge.py", line 627, in __init__ ) = self._get_merge_keys() File "C:\Users\U321103\Anaconda3\envs\Stats\lib\site-packages\pandas\core\reshape\merge.py", line 983, in _get_merge_keys right_keys.append(right._get_label_or_level_values(rk)) File "C:\Users\U321103\Anaconda3\envs\Stats\lib\site-packages\pandas\core\generic.py", line 1692, in _get_label_or_level_values raise KeyError(key) KeyError: 'plant_name'
DataFrame创建方式:
coeff创建代码:
coeff = output.reset_index() print(coeff) coeff.columns.values[1]= "slopex" coeff.columns.values[0]= 'plant_name' index Slope intercept 0 BII NEE STIPA 1.095434 -1278.741489 1 DOS ARBOLITOS 1.161407 -3438.054141 2 PIER B 0.819827 3352.473727 3 PIER II 0.906328 903.044250 4 PIER IV 0.987371 4850.368353 5 SANTIAGO 0.395098 21697.674121 6 VENTA III 1.069942 -1924.804108 7 VENTOSA 0.986452 -1926.409407
ncDatam创建代码:
ncData.columns Out[81]: Index(['plant_name', 'business_name', 'maint_region_name', 'power_kwh', 'dataset', 'year', 'month', 'day', 'hour'], dtype='object') ncDatam = ncData.groupby(["plant_name","year","month"])[["power_kwh"]].mean().reset_index().round(2)
列数据类型:
print(coeff.columns.to_series().groupby(coeff.dtypes).groups) {dtype('float64'): Index(['slopex', 'intercept'], dtype='object'), dtype('O'): Index(['plant_name'], dtype='object')} print(ncDatam.columns.to_series().groupby(ncDatam.dtypes).groups) {dtype('int64'): Index(['year', 'month'], dtype='object'), dtype('float64'): Index(['power_kwh'], dtype='object'), dtype('O'): Index(['plant_name'], dtype='object')}
排查原因
核心问题出在coeff的列名修改方式:直接操作columns.values修改列名,可能导致Pandas内部列名元数据未同步更新,或者列名存在不可见空白字符(如空格、制表符)。虽然打印coeff.columns显示列名为plant_name,但实际内部列名与字面显示存在差异,导致合并时无法匹配。
解决方案
方案1:使用标准列名修改方法替代直接操作columns.values
用Pandas官方推荐的方式修改列名,确保元数据同步:
# 方式一:直接赋值完整列名列表 coeff.columns = ['plant_name', 'slopex', 'intercept'] # 方式二:使用rename方法精准修改 coeff = coeff.rename(columns={'index': 'plant_name', 'Slope': 'slopex'})
方案2:清理列名中的不可见字符
若列名存在隐藏空白,先清理两个DataFrame的列名:
# 清理coeff列名 coeff.columns = [col.strip() for col in coeff.columns] # 清理ncDatam列名 ncDatam.columns = [col.strip() for col in ncDatam.columns]
方案3:明确指定左右表的合并列
合并时分别指定左右表的列名,强制匹配:
df = ncDatam.merge(coeff, left_on='plant_name', right_on='plant_name')
验证步骤
修改后执行以下命令确认列名有效性:
# 打印列名列表 print(coeff.columns.tolist()) print(ncDatam.columns.tolist()) # 检查列名是否存在 print('plant_name' in coeff.columns) print('plant_name' in ncDatam.columns)
内容的提问来源于stack exchange,提问作者user2100039
相关产品推荐
相关产品推荐

