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

Pandas循环访问DataFrame条目触发get_loc KeyError问题排查

Pandas循环访问DataFrame列元素触发KeyError的原因与解决方法

问题现象

执行以下代码时,标记行触发KeyError: 0:

df_original = pd.read_csv(csv_dataframe_filename, sep='\t', header=[0, 1], encoding_errors="replace")
df_original.columns = ['A', 'B',
              'Count_Number', 'D',
              'E', 'F',
              'use_first', 'H', 'I']

df_use = df_original
df_use = df_use.drop(df_use[((df_use['use_first']=='no'))].index)
df_use.columns = ['A', 'B',
              'Count_Number', 'D',
              'E', 'F',
              'use_first', 'H', 'I']


c_mag = np.zeros((len(df_use), 1))
x = 0
for i in range(len(df_use)):
    print(df_use['Count_Number'][x]) # 触发KeyError的行
    x += 1
print(c_mag)
print(df_use['Count_Number'][x])
  • 使用固定数字而非变量x时正常
  • 使用未删除行的df_original时正常
  • 最后一行打印df_use['Count_Number'][x]能运行(仅为巧合,取决于删除后剩余的索引标签)

核心原因

Pandas中df['列名'][x]是**按标签索引(Label Index)**取值,而非按位置:

  1. 执行drop()删除行后,DataFrame的标签索引不会自动重置。比如原df_original的索引是连续的0,1,2,3...,删除部分行后,df_use的索引可能变成0,2,3...(假设删除了索引1的行)。
  2. 循环中x从0开始递增,当x指向一个被删除的索引标签时(比如x=1),就会抛出KeyError,因为该标签不存在于df_use的索引中。
  3. 而.iloc[x]是**按位置索引(Position Index)**取值,直接取第x个位置的元素,不受标签索引的影响,因此能正常运行。

解决方案

方案1:使用位置索引.iloc访问

直接用.iloc按位置取值,无需修改索引:

c_mag = np.zeros((len(df_use), 1))
for x in range(len(df_use)):
    # 按位置访问第x个元素
    value = df_use['Count_Number'].iloc[x]
    print(value)
    # 这里可以添加你的计算逻辑,比如c_mag[x] = ...

方案2:重置索引

删除行后重置索引,让标签索引与位置索引一致:

# 删除行后立即重置索引,drop=True丢弃原索引列
df_use = df_use.drop(df_use[((df_use['use_first']=='no'))].index).reset_index(drop=True)

# 之后可以直接用[x]按标签访问
c_mag = np.zeros((len(df_use), 1))
x = 0
for i in range(len(df_use)):
    print(df_use['Count_Number'][x])
    x += 1

方案3:避免循环(推荐)

Pandas的核心优势是向量运算,远快于for循环。如果你的需求是对Count_Number列进行计算,直接对列操作即可:

# 直接将列转为numpy数组,无需循环
c_mag = df_use['Count_Number'].values.reshape(-1, 1)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 13:10:30