Pandas df.iloc[] 函数
iloc[] 是 Pandas 中基于整数位置(Integer Location)的索引方式,用于通过行号和列号来选择数据。它与 loc[] 不同,iloc[] 完全基于数据的位置(从 0 开始的整数索引),而不考虑数据本身设置的标签。
当你需要按位置选择数据,或者在不知道具体索引标签的情况下选择数据时,iloc[] 是最佳选择。它的工作方式与 Python 列表的索引非常相似,对 Python 用户来说非常直观。
基本语法与参数
iloc[] 是 DataFrame 的索引器,通过方括号 [] 来访问。它只接受整数、整数列表、整数切片或布尔数组作为参数。
语法格式
# 选择单行(返回 Series) DataFrame.iloc[行号] # 选择多行(返回 DataFrame) DataFrame.iloc[[行号1, 行号2, ...]] # 使用切片选择连续行 DataFrame.iloc[起始行:结束行] # 选择行和列 DataFrame.iloc[行号, 列号] DataFrame.iloc[行切片, 列切片] DataFrame.iloc[行列表, 列列表]
参数说明
| 参数位置 | 参数类型 | 说明 |
|---|---|---|
| 第一个参数(行) | 整数、整数列表、整数切片、布尔数组 | 用于选择行,基于位置(从 0 开始)。 |
| 第二个参数(列) | 整数、整数列表、整数切片 | 可选,用于选择列,同样基于位置。 |
返回值说明
- 单个元素: 返回标量值。
- 单行: 返回一个 Series。
- 多行: 返回一个 DataFrame。
- 行列组合: 根据选择结果返回 Series 或 DataFrame。
实例
让我们通过丰富的例子全面掌握 iloc[] 的用法。
示例 1:基础用法 - 选择行
iloc[] 使用基于位置的索引,与 Python 列表的索引方式非常相似。
实例
# 创建示例 DataFrame
data = {
'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
'age': [18, 19, 17, 18, 20],
'score': [85, 92, 78, 90, 88],
'grade': ['A', 'A', 'B', 'A', 'B']
}
df = pd.DataFrame(data)
print("原始 DataFrame:")
print(df)
print()
# 选择第一行(索引 0)
print("选择第一行(位置 0):")
print(df.iloc[0])
print()
# 选择多行
print("选择第 1、3、4 行:")
print(df.iloc[[1, 3, 4]])
print()
# 使用切片选择连续的行(注意:iloc 的切片是左闭右开的,与 Python 相同)
print("选择第 1 行到第 3 行(位置 1、2、3):")
print(df.iloc[1:4])
print()
# 选择前 3 行
print("前 3 行:")
print(df.iloc[:3])
运行结果:
原始 DataFrame:
name age score grade
0 Alice 18 85 A
1 Bob 19 92 A
2 Charlie 17 78 B
3 David 18 90 A
4 Eve 20 88 B
选择第一行(位置 0):
name Alice
age 18
score 85
grade A
Name: 0, dtype: object
选择第 1、3、4 行:
name age score grade
1 Bob 19 92 A
3 David 18 90 A
4 Eve 20 88 B
选择第 1 行到第 3 行(位置 1、2、3):
name age score grade
1 Bob 19 92 A
2 Charlie 17 78 B
3 David 18 90 A
前 3 行:
name age score grade
0 Alice 18 85 A
1 Bob 19 92 A
2 Charlie 17 78 B
代码解析:
df.iloc[0]选择第一行(位置 0),返回一个 Series。iloc[]的切片是左闭右开的,包含位置 1、2、3,不包括位置 4。df.iloc[[1, 3, 4]]选择多个特定位置的行。df.iloc[:3]省略起始位置表示从 0 开始。
示例 2:选择特定的行列
iloc[] 可以同时选择行和列,通过位置编号精确定位。
实例
data = {
'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
'age': [18, 19, 17, 18, 20],
'score': [85, 92, 78, 90, 88],
'grade': ['A', 'A', 'B', 'A', 'B']
}
df = pd.DataFrame(data)
# 选择单个单元格(第二行、第三列)
print("选择位置 [1, 2] 的单元格:")
print(df.iloc[1, 2]) # 返回 92
print()
# 选择特定行的特定列
print("选择第 0 行的第 1 和第 3 列:")
print(df.iloc[0, [1, 3]])
print()
# 选择多行多列
print("选择第 0、2、4 行的第 0、2 列:")
print(df.iloc[[0, 2, 4], [0, 2]])
print()
# 选择所有行的特定列
print("所有行的第 0 和第 2 列:")
print(df.iloc[:, [0, 2]])
print()
# 行切片和列切片结合
print("第 1 到 3 行的第 0 到第 2 列(不含):")
print(df.iloc[1:4, :3])
运行结果:
选择位置 [1, 2] 的单元格:
92
选择第 0 行的第 1 和第 3 列:
age 19
grade A
Name: 0, dtype: object
选择第 0、2、4 行的第 0、2 列:
name score
0 Alice 85
2 Charlie 78
4 Eve 88
所有行的第 0 和第 2 列:
name score
0 Alice 85
1 Bob 92
2 Charlie 78
3 David 90
4 Eve 88
第 1 到 3 行的第 0 到第 2 列(不含):
name age
1 Bob 19
2 Charlie 17
3 David 18
代码解析:
df.iloc[1, 2]选择单个单元格,返回标量值。df.iloc[0, [1, 3]]选择特定行的多列。df.iloc[:, [0, 2]]冒号表示选择所有行。iloc[]的切片遵循 Python 惯例,左闭右开(不含结束位置)。
示例 3:与自定义索引结合使用
当 DataFrame 有自定义索引时,iloc[] 仍然按照位置选择数据,与索引标签无关。
实例
# 创建带自定义索引的 DataFrame
data = {
'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
'age': [18, 19, 17, 18, 20],
'score': [85, 92, 78, 90, 88]
}
df = pd.DataFrame(data, index=['a', 'b', 'c', 'd', 'e'])
print("带自定义索引的 DataFrame:")
print(df)
print()
# iloc 仍然按位置选择,不受自定义索引影响
print("iloc[0] 选择第一行(位置 0):")
print(df.iloc[0])
print()
print("iloc[1:3] 选择第 2、3 行(位置 1、2):")
print(df.iloc[1:3])
print()
# 使用负数索引(从末尾开始计数)
print("最后一行(位置 -1):")
print(df.iloc[-1])
print()
print("倒数 3 行:")
print(df.iloc[-3:])
运行结果:
带自定义索引的 DataFrame:
name age score
a Alice 18 85
b Bob 19 92
c Charlie 17 78
d David 18 90
e Eve 20 88
iloc[0] 选择第一行(位置 0),与标签 'a', 'b', 'c' 无关:
name Alice
age 18
score 85
Name: a, dtype: object
iloc[1:3] 选择第 2、3 行(位置 1、2):
name age score
b Bob 19 92
c Charlie 17 78
最后一行(位置 -1):
name Eve
age 20
score 88
Name: e, dtype: object
倒数 3 行:
name age score
c Charlie 17 78
d David 18 90
e Eve 20 88
代码解析:
- 即使 DataFrame 使用自定义索引('a', 'b', 'c', 'd', 'e'),
iloc[]仍然按照位置选择。 iloc[0]总是选择第一行(物理位置),不论索引标签是什么。iloc支持负数索引,-1 表示最后一行,-2 表示倒数第二行,以此类推。
示例 4:使用布尔数组选择
iloc[] 也支持使用布尔数组进行选择,这在条件筛选中很有用。
实例
data = {
'name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'],
'age': [18, 19, 17, 18, 20],
'score': [85, 92, 78, 90, 88],
'grade': ['A', 'A', 'B', 'A', 'B']
}
df = pd.DataFrame(data)
# 使用布尔数组选择
bool_array = [True, False, True, False, True]
print("使用布尔数组 [True, False, True, False, True] 选择的行:")
print(df.iloc[bool_array])
print()
# 结合条件使用(先计算布尔数组,再用于 iloc)
# 选择分数大于 85 的行
condition = df['score'] > 85
print("分数大于 85 的行:")
print(df.iloc[condition.values]) # 获取布尔数组
print()
# 选择特定位置的行后,再选择特定列
print("第 1、3 行的第 1、2 列:")
print(df.iloc[[1, 3], 1:3])
运行结果:
使用布尔数组 [True, False, True, False, True] 选择的行:
name age score grade
0 Alice 18 85 A
2 Charlie 17 78 B
4 Eve 20 88 B
分数大于 85 的行:
name age score grade
1 Bob 19 92 A
3 David 18 90 A
4 Eve 20 88 B
第 1、3 行的第 1、2 列:
age score
1 19 92
3 18 90
代码解析:
- 布尔数组的长度必须与行数(对于行选择)或列数(对于列选择)相同。
iloc使用布尔数组时,与loc[]的条件筛选不同,它直接按位置选择。- 可以通过切片步长来选择特定的模式,比如每隔一行选择一次。
注意事项
iloc[]使用的是位置索引,切片遵循 Python 惯例(左闭右开)。- 如果传入的位置超出范围,会抛出 IndexError 错误。
- 支持负数索引,-1 表示最后一行,-2 表示倒数第二行。
- 与
loc[]不同,iloc[]不支持使用条件表达式直接筛选,需要先计算布尔数组。
重要提示:
loc[]和iloc[]的区别是 Pandas 学习中的重点。loc[]基于标签,iloc[]基于位置。在开发时建议明确区分两者,避免混淆导致错误。
小结
iloc[] 是 Pandas 中基于整数位置的数据选择器,它提供了与 Python 列表相似的索引体验。它的主要特点是完全基于数据的位置(从 0 开始),不受自定义索引标签的影响。
在实际使用中,iloc[] 特别适合以下场景:需要按位置选择数据时、需要使用负数索引时、需要使用切片步长时、以及在不确定索引标签的情况下选择数据。结合 loc[] 和 iloc[],可以灵活应对各种数据选择需求。

Pandas 常用函数