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

为何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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 20:55:30