编写Pandas函数批量处理带数字后缀列报错求助
Pandas遍历Subject列拆分数据报错KeyError解决
问题背景
现有包含11列的Pandas DataFrame,列名如下:
df.columns = ["Document","Subject1","Subject2","Subject3","Subject4","Subject5","Subject6","Subject7","Subject8","Subject9","Subject10"]
需要遍历所有Subject开头的列执行数据清洗与拆分操作,但运行代码后抛出KeyError: 'Subject{0}'错误。
错误代码
columns = df['Subject{0}'] def split_data(): for col in columns: df['Subject_{0}_URI'] = col.str.split('>', 1).str[0] + '>' df['Subject{0}'] = col.str[:-6] df['Subject_{0}'] = col.str.split('>', 1).str[1] df1 = df.drop(col, axis = 1) df1.to_excel('/merged_results.xlsx', index = False) split_data()
错误信息
The above exception was the direct cause of the following exception: Traceback (most recent call last): File "/merge_results.py", line 44, in <module> split_data() File "/merge_results.py", line 39, in split_data df3['Subject_{0}_URI'] = df3['Subject{0}'].str.split('>', 1).str[0] + '>' File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/pandas/core/frame.py", line 3807, in __getitem__ indexer = self.columns.get_loc(key) File "/Library/Frameworks/Python.framework/Versions/3.10/lib/python3.10/site-packages/pandas/core/indexes/base.py", line 3804, in get_loc raise KeyError(key) from err KeyError: 'Subject{0}'
错误原因分析
- 列选择错误:
columns = df['Subject{0}']试图获取名为Subject{0}的列,但该列不存在,应该筛选所有以Subject开头的列名列表。 - 字符串占位符未格式化:代码中使用
'Subject{0}_URI'这类带占位符的字符串,但未执行格式化,导致Pandas将Subject{0}当作列名查找,引发KeyError。 - 循环逻辑混乱:每次循环直接修改原DataFrame,且每次循环都覆盖保存Excel文件,最终仅保留最后一次循环的结果;同时存在重复赋值(
df['Subject{0}']和df['Subject_{0}']),逻辑矛盾。
修正后的代码
def split_data(df): # 筛选所有以Subject开头的列名 subject_cols = [col for col in df.columns if col.startswith('Subject')] for col in subject_cols: # 提取列编号(比如从Subject1中拿到1) num = col.replace('Subject', '') # 拆分数据并展开为两列 split_result = df[col].str.split('>', 1, expand=True) # 新增URI列 df[f'Subject_{num}_URI'] = split_result[0] + '>' # 替换原列内容为拆分后的第二部分 df[col] = split_result[1] # 所有列处理完成后统一保存 df.to_excel('/merged_results.xlsx', index=False) # 调用函数,传入目标DataFrame split_data(df)
关键说明
- 用列表推导式正确筛选所有
Subject开头的列,避免无效列名查找。 - 使用f-string完成字符串格式化,生成合法的新列名。
- 用
str.split(..., expand=True)将拆分结果转为DataFrame,简化赋值操作。 - 统一在所有列处理完成后保存Excel,避免多次覆盖文件。
内容的提问来源于stack exchange,提问作者Sirod
相关产品推荐
相关产品推荐

