DataFrame列相乘出现KeyError 'E-E11',求技术解决方案
问题排查与解决
核心问题分析
触发KeyError 'E-E11'以及计算失败的原因集中在以下几点:
- 变量名覆盖:函数内将全局的DataFrame变量
Volx重新赋值为字符串(Volx = 'EVOL' % (i+1)),后续代码试图用字符串做索引操作,完全偏离了原本要操作的DataFrame。 - 字符串格式化错误:
'EVOL' % (i+1)写法无效,无法生成带序号的列名;即便你不需要多列,这段代码也会破坏原有变量。 - 逻辑冗余与冲突:函数内重复对
Multiplicationx赋值,最后一行直接覆盖前一行的计算结果,且参数Multiplicationx未实际使用。 - 列名验证缺失:执行
drop操作后未确认剩余列名是否正确,不排除误删目标列的可能。
修复步骤与代码
第一步:确认列名正确性
先验证drop操作后两个DataFrame的列是否符合预期:
import pandas as pd Volx = pd.read_csv('BCCdir1VOL.csv') Volx.drop(Volx.columns[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]], inplace=True, axis=1) print("Volx 剩余列:", Volx.columns) # 应输出 Index(['EVOL'], dtype='object') data1 = pd.read_csv('abaqusBCC1Dir.csv') data1.drop(data1.columns[[0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 13, 14, 15]], inplace=True, axis=1) print("data1 剩余列:", data1.columns) # 应输出 Index(['E-E11'], dtype='object')
如果输出不符合预期,说明drop操作误删了目标列,需要调整columns的索引列表。
第二步:简化计算(单列场景)
根据你的描述,两DataFrame各只有一列,无需循环,直接执行相乘:
# 直接生成结果列 data1['E11x_V'] = data1['E-E11'] * Volx['EVOL']
第三步:多列场景适配(如果需要处理多组列)
如果后续需要处理E-E111/EVOL1、E-E112/EVOL2这类带序号的列,修正函数逻辑,避免变量覆盖:
def getPower(data1, vol_df, num_of_cols): for i in range(num_of_cols): # 正确生成带序号的列名 evol_col = f'EVOL{i+1}' e11_col = f'E-E11{i+1}' result_col = f'E11x_V{i+1}' # 先检查列是否存在,避免KeyError if e11_col not in data1.columns or evol_col not in vol_df.columns: print(f"跳过:列{e11_col}或{evol_col}不存在") continue # 执行相乘计算 data1[result_col] = data1[e11_col] * vol_df[evol_col] # 调用示例(假设需要处理1组列) getPower(data1, Volx, 1)
内容的提问来源于stack exchange,提问作者Asta Surviliene
相关产品推荐
相关产品推荐

