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)**取值,而非按位置:
- 执行
drop()删除行后,DataFrame的标签索引不会自动重置。比如原df_original的索引是连续的0,1,2,3...,删除部分行后,df_use的索引可能变成0,2,3...(假设删除了索引1的行)。 - 循环中
x从0开始递增,当x指向一个被删除的索引标签时(比如x=1),就会抛出KeyError,因为该标签不存在于df_use的索引中。 - 而
.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
相关产品推荐
相关产品推荐

