iloc只认数字位置,不认列名或索引标签;取值需用整数、切片或列表,单元素返回标量,行列加方括号才得DataFrame,负数索引有效但越界切片静默返回空。
![pandas iloc怎么用_iloc[行号,列号]按数字位置索引数据实战](https://img.php.cn/upload/article/000/969/633/177371947180433.png)
iloc 只认数字位置,不认列名或索引标签
你写 df.iloc[0, 'age'] 会直接报错:ValueError: Location based indexing can only have [integer, integer slice, list-like, boolean array] types。因为 iloc 的设计原则就是纯位置索引——行和列都必须用整数或整数切片,跟列名、索引值完全无关。
常见错误是混用 loc 和 iloc 的逻辑:比如想取第一行“age”列,误写成 df.iloc[0, 'age'];正确做法是先用 df.columns.get_loc('age') 拿到列位置,再传给 iloc。
- 用
df.columns.get_loc('col_name')查列号(返回 int),再喂给iloc - 用
df.index.get_loc(label)查行号——但这只适用于你想把 label 转成位置时,iloc本身不接受 label - 切片如
df.iloc[1:4, 2:5]是左闭右开,和 Python 列表一致,不是 SQL 那种闭区间
取单行、单列、多行多列的写法差异
iloc 对单元素、列表、切片的处理方式不同,稍不注意就会返回意外类型。比如你以为 df.iloc[0, 0] 是标量,它确实是;但 df.iloc[[0], 0] 返回的是 Series,而 df.iloc[0, [0]] 返回的是 Series(带 name),df.iloc[[0], [0]] 才是单单元格的 DataFrame。
这直接影响后续链式操作:对 Series 调 .mean() 没问题,但对 DataFrame 就得指定 axis,否则默认按列算。
- 取单值:
df.iloc[2, 3]→ 标量(如float64) - 取一行:
df.iloc[2, :]→Series;df.iloc[[2], :]→DataFrame - 取一列:
df.iloc[:, 1]→Series;df.iloc[:, [1]]→DataFrame - 要确保结果是 DataFrame,行列都要用列表包裹,哪怕只有一个
遇到负数索引或越界时的行为
iloc 支持负数,-1 表示最后一行,-2 是倒数第二行……但它**不支持负数切片的“自动截断”**。比如 df.iloc[-5:, :] 在数据少于 5 行时不会报错,而是从第 0 行开始取;但 df.iloc[100:, :] 这种明显越界的切片,会返回空 DataFrame,不抛异常——这点容易掩盖逻辑错误。
更隐蔽的问题是混合使用负数和正数:如 df.iloc[-2:2, :],由于 -2 在 2 前面,结果为空;Python 切片规则依然生效,不会自动调整顺序。
- 负数索引安全,但别依赖它“兜底”,显式检查
len(df) >= N更可靠 - 越界切片静默返回空,建议在关键步骤后加
assert not df_result.empty或检查shape -
df.iloc[100](单索引)会明确报IndexError,但df.iloc[100:101]不会
和 loc、iat、at 的性能与适用场景对比
如果你只按位置取单个值,iat 比 iloc 快得多(底层绕过索引校验);但 iat 只支持单行单列,不能切片、不能列表索引。而 iloc 是通用位置索引器,灵活但有额外开销。
另一个坑是:当 DataFrame 有重复索引时,loc 可能返回多行,iloc 则完全不受影响——它只看物理位置。所以如果业务逻辑依赖“第 N 条记录”,必须用 iloc,而不是靠 loc + 原始索引。
- 单点取值优先用
df.iat[row_int, col_int],比iloc快 3–5 倍 - 需要切片、布尔数组、列表索引 → 只能用
iloc - 列名稳定且需语义化读取 → 用
loc;但要注意loc的切片是闭区间(loc[1:3]包含第 3 行) - 修改值时,
iloc和iat都支持赋值,但iat不支持链式赋值(df.iloc[0, 0] = x安全,df[df.a>1].iat[0,0] = x会 SettingWithCopyWarning)
iloc 返回的是你要的结构,结果发现是 Series 而不是 DataFrame,后续 .apply() 或 .merge() 直接崩掉。确认 shape 和 type,比猜更省时间。










