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

编写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}'

错误原因分析

  1. 列选择错误:columns = df['Subject{0}']试图获取名为Subject{0}的列,但该列不存在,应该筛选所有以Subject开头的列名列表。
  2. 字符串占位符未格式化:代码中使用'Subject{0}_URI'这类带占位符的字符串,但未执行格式化,导致Pandas将Subject{0}当作列名查找,引发KeyError。
  3. 循环逻辑混乱:每次循环直接修改原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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.07 13:05:22