为何pandas.DataFrame.iloc选取指定行返回错误索引?
问题:iloc返回行索引不符合预期,loc却正常的原因
当使用索引列表获取DataFrame子集时,发现.iloc返回的行索引与预期不符,但.loc能返回索引正确的行,原因如下:
代码示例与现象
加载数据:
df = pdTools.LoadSDF(infile, removeHs=False, sanitize=False) print(df.shape) >>(499997, 13)
使用.iloc的输出(行索引不符合预期):
print(df.iloc[[8888,10000, 20000, 77777, 400000, 450000]])
idnumber 8888 Z2885081048 10000 Z2893553470 20000 Z2906211876 77778 Z2996496294 400003 Z4897443126 450003 Z5129522901
使用.loc的预期输出(行索引正确):
print(df.loc[[8888,10000, 20000, 77777, 400000, 450000]])
idnumber 8888 Z2885081048 10000 Z2893553470 20000 Z2906211876 77777 Z2996496291 400000 Z4897436078 450000 Z5129522881
原因解析
核心差异在于.iloc和.loc的定位逻辑完全不同:
.iloc:按物理位置索引取值,它不关心DataFrame的行标签(index)是什么,只认你传入的数字对应的第N行(从0开始计数)。.loc:按行标签索引取值,直接匹配你传入的行标签,返回标签完全对应的行。
你的案例中,DataFrame的行标签(index)并非连续的从0开始的整数(大概率是中间有行被删除过),导致行标签和物理位置出现错位:
比如你传入iloc[77777],它取的是DataFrame中第77778行(物理位置),而这一行的行标签恰好是77778;而loc[77777]则是直接找到行标签为77777的那一行,这才是你需要的目标行。
验证方法
可以通过以下代码确认行标签与物理位置的错位:
# 检查索引是否唯一 print(df.index.is_unique) # 检查索引是否连续递增 print(df.index.is_monotonic_increasing) # 查看索引的范围 print(df.index.min(), df.index.max())
内容的提问来源于stack exchange,提问作者dummyQ
相关产品推荐
相关产品推荐

