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

Python遍历字符串写入DataFrame触发Key Error报错咨询

问题根因

报错来自pandas索引的语法误用,你写的df[i][j]属于错误的链式索引写法:

  • pandas中单中括号传入单个值时,优先按列名匹配列,不是按位置取行。第一层df[i]会直接查找列名等于i的列,当循环变量i增长到和DataFrame总列数(比如你说的45)相等时,表中不存在名为45的列,就会抛出KeyError: 45,和你观察到的报错现象完全一致。
  • 就算i值没超过列数范围,第二层[j]是在取出的单列Series上匹配索引值等于j的行,不是按位置定位单元格,就算不报错也极易出现值错位、赋值不生效的问题,pandas官方本身就禁止用链式索引做写操作。
排查思路
  • 先打印df.columns确认所有列名的取值范围,再在循环中打印每次迭代的i值,就能观测到当i等于总列数时,刚好触发列查找失败的报错。
  • 记住pandas基础索引规则:直接用df[值]的写法,传单个标量默认取列,传切片才默认按行切,不要把pandas的索引和二维列表的索引逻辑搞混。
修复方案

优先选批量赋值方案,不要写双层逐格循环,运行效率会高几个数量级:

方案1:批量位置赋值(推荐)

如果converted_array是和目标DataFrame行、列维度对齐的二维结构(numpy数组、二维列表都可以),直接用.iloc位置索引一次性完成赋值,不需要写循环:

# .iloc的规则是 [行范围, 列范围],和你原逻辑里i行j列的顺序完全对应
df.iloc[:rows, :columns-1] = converted_array[:rows, :columns-1]

如果converted_array是普通Python列表,先转成numpy数组再赋值即可:

import numpy as np
df.iloc[:rows, :columns-1] = np.array(converted_array)[:rows, :columns-1]

方案2:逐格赋值场景

如果确实需要保留逐格循环的逻辑,必须用.iloc明确指定按位置定位单元格,不要用裸的中括号索引:

for i in range(rows):
    j = 0
    while j < columns - 1:
        # iloc传两个参数,分别对应行位置、列位置,不会触发列名匹配
        df.iloc[i, j] = converted_array[i][j]
        j += 1

更优简化写法

如果你的目标就是把converted_array转成DataFrame,完全不需要先创建空表再循环赋值,直接构造即可:

import pandas as pd
# 可按需传入columns、index参数自定义列名、行索引
df = pd.DataFrame(converted_array)

内容的提问来源于stack exchange,提问作者Kebaber

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.27 06:21:28