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 提供的基于标签的选择功能。