趋近智
Pandas 中的数据选择常需要根据数据的确切位置而不是其标签来访问信息。有时,你需要完全根据数据的整数位置来检索数据,而无需考虑 DataFrame 中分配的索引标签或列名。当行或列的顺序已知但其具体标签未知时,或者在处理使用默认整数索引的 DataFrame 时,这种方法尤其有用。为了满足这一特定需求,Pandas 提供了 .iloc 访问器。
.iloc 访问器的工作方式很像标准的 Python 列表和 NumPy 数组索引。它使用基于 0 的整数位置来选择行和列。请记住,Python 的切片约定适用:起始边界包含在内,而结束边界不包含在内。
一般语法是 DataFrame.iloc[row_indexer, column_indexer]。row_indexer 和 column_indexer 都接受整数、整数列表、带有整数的切片或布尔数组(尽管使用标准 [] 或 .loc 进行布尔索引通常更清晰)。如果你只提供一个索引器,则默认为行索引器。
我们来用一个示例 DataFrame 进行说明:
import pandas as pd
import numpy as np
data = {'col_a': [10, 20, 30, 40, 50],
'col_b': [0.1, 0.2, 0.3, 0.4, 0.5],
'col_c': ['x', 'y', 'z', 'x', 'y']}
# 注意自定义字符串索引
df_example = pd.DataFrame(data, index=['row1', 'row2', 'row3', 'row4', 'row5'])
print("示例 DataFrame:")
print(df_example)
示例 DataFrame:
col_a col_b col_c
row1 10 0.1 x
row2 20 0.2 y
row3 30 0.3 z
row4 40 0.4 x
row5 50 0.5 y
要通过整数位置选择单行,请将该整数传递给 .iloc:
# 选择第一行(位置 0)
first_row = df_example.iloc[0]
print("\n第一行(位置 0):")
print(first_row)
# 选择第三行(位置 2)
third_row = df_example.iloc[2]
print("\n第三行(位置 2):")
print(third_row)
第一行(位置 0):
col_a 10
col_b 0.1
col_c x
Name: row1, dtype: object
第三行(位置 2):
col_a 30
col_b 0.3
col_c z
Name: row3, dtype: object
注意,尽管我们的索引由字符串(如 'row1'、'row2' 等)组成,但 .iloc 仍根据行基于 0 的整数位置来访问它们。结果是一个 Pandas Series,包含该行的数据,并以原始列名作为其索引。
你可以通过提供整数列表来选择多个特定行,或者使用切片表示法选择一系列行。
# 选择第一行和第三行(位置 0 和 2)
rows_0_2 = df_example.iloc[[0, 2]]
print("\n位置 0 和 2 的行:")
print(rows_0_2)
# 选择从位置 1 开始,直到(但不包含)位置 4 的行
rows_1_to_3 = df_example.iloc[1:4] # 选择索引为 1、2、3 的行
print("\n从位置 1 到位置 4 的行:")
print(rows_1_to_3)
# 选择从开头到位置 3(不包含)的行
first_three_rows = df_example.iloc[:3]
print("\n前三行:")
print(first_three_rows)
# 选择从位置 3 到末尾的行
last_rows = df_example.iloc[3:]
print("\n从位置 3 到末尾的行:")
print(last_rows)
位置 0 和 2 的行:
col_a col_b col_c
row1 10 0.1 x
row3 30 0.3 z
从位置 1 到位置 4 的行:
col_a col_b col_c
row2 20 0.2 y
row3 30 0.3 z
row4 40 0.4 x
前三行:
col_a col_b col_c
row1 10 0.1 x
row2 20 0.2 y
row3 30 0.3 z
从位置 3 到末尾的行:
col_a col_b col_c
row4 40 0.4 x
row5 50 0.5 y
正如所料,选择多行会返回一个包含指定行的新 DataFrame。切片行为 start:end 包含 start 但不包含 end,这与 Python 标准一致。
当你需要根据行和列的位置选择特定元素或子部分时,.iloc 的优势明显。你先提供行索引器,然后是列索引器,两者之间用逗号分隔。
# 选择行位置 1、列位置 0 的元素
element_1_0 = df_example.iloc[1, 0]
print(f"\n行位置 1、列位置 0 的元素:{element_1_0}")
# 选择第一行(位置 0)和前两列(位置 0、1)
row0_cols01 = df_example.iloc[0, 0:2]
print("\n第一行,前两列:")
print(row0_cols01)
# 选择前三行(位置 0、1、2)和第一列及第三列(位置 0、2)
subset = df_example.iloc[0:3, [0, 2]]
print("\n前三行,列 0 和 2:")
print(subset)
# 选择所有行和最后一列(位置 -1 也可以!)
last_col = df_example.iloc[:, -1]
print("\n所有行,最后一列:")
print(last_col)
行位置 1、列位置 0 的元素:20
第一行,前两列:
col_a 10
col_b 0.1
Name: row1, dtype: object
前三行,列 0 和 2:
col_a col_c
row1 10 x
row2 20 y
row3 30 z
所有行,最后一列:
row1 x
row2 y
row3 z
row4 x
row5 y
Name: col_c, dtype: object
使用 : 选择所有行或所有列,这与 NumPy 切片相似。负数索引从末尾开始计数(例如,-1 是最后一列)。
.iloc 与 .loc记住它们的区别非常重要:
.loc:基于标签选择(索引标签、列名)。使用标签进行切片时,起始和结束标签都包含在内。.iloc:基于整数位置选择(基于 0)。使用整数进行切片时,不包含结束位置。尝试将标签与 .iloc 结合使用,或将整数位置与 .loc 结合使用(除非标签恰好是整数)将导致错误。理解这种区别对于正确获取所需数据很重要。
熟练使用 .iloc 提供了一种根据数据在 DataFrame 结构中的位置来获取数据的精确方法,补充了 .loc 提供的基于标签的选择功能。
这部分内容有帮助吗?
.iloc访问器的官方文档,提供直接使用示例和技术细节。© 2026 ApX Machine Learning用心打造