关于Pandas版本: 本文基于 pandas2.2.0 编写。
关于本文内容更新: 随着pandas的stable版本更迭,本文持续更新,不断完善补充。
传送门: Pandas API参考目录
传送门: Pandas 版本更新及新特性
传送门: Pandas 由浅入深系列教程
本节目录
Pandas.DataFrame.iloc[ ]
Pandas.DataFrame.iloc[ ] 方法用于通过 自然索引 自然索引 筛选 DataFrame 数据。
- 注意!在此方法中,你传递的整数,会被理解为
自然索引自然索引,表示的是从0开始的整数位置。 -
⚠️ 注意 :
语法:
DataFrame.iloc [行索引,列索引]
返回值:
- Series or DataFrame or Scalar
- 筛选范围、
DataFrame是否具有多层索引等都会影响具体的返回形式。 - 如果筛选结果是
Series或Scalar时,筛选条件套上 [ ] 方括号,可以强制以DataFrame样式返回。例1
- 筛选范围、
语法说明:
1、筛选1行,筛选1列,筛选单元格
-
DataFrame.iloc[行索引,列索引] 例1
行索引、列名索引,用英文逗号分隔。
- 筛选1行: DataFrame.iloc[行索引,: ] 红色的冒号表示所有列。只传行索引时,红色逗号、冒号可以省略。
- 筛选1列: DataFrame.iloc[:, 列索引] 红色冒号必须有,表示所有行。
- 筛选单元格: DataFrame.iloc[行索引**,** 列索引]
2、筛选多行,筛选多列
-
DataFrame.loc[[行索引1’,'行索引2, …],[列索引1,列索引2, …]]例3
多个行索引筛选条件用方括号包裹、多个列名索引筛选条件用方括号包裹。两种条件用英文逗号分隔。
- 筛选多行: DataFrame.iloc[[行索引1,行索引2, …], ] 只传行递行索引条件时,红色逗号可以省略。
- 筛选多列: DataFrame.iloc[, [‘列索引1’,‘列索引2’, …]]
- 同时筛选多行多列: DataFrame.loc[[‘行索引1’,‘行索引2’, …], [‘列索引1’,‘列索引2’, …]]
-
⚠️ 注意 :
-
多个条件,必须用 [ ] 方括号包裹!
-
与
Python切片不同,被 [ ] 包裹的多个位置的索引,都会包含在筛选条件内。
-
3、范围筛选
-
DataFrame.iloc[[行索引1:行索引x],[列索引1:列索引x]] 例4
开始和结束的范围用英文冒号分隔。
-
行和列都支持范围筛选: DataFrame.iloc[[行索引1:行索引x], [列索引1:列索引x ]] 只传递行索引条件时,红色逗号可以省略。
-
范围筛选可以和单条筛选混用: DataFrame.iloc[[行索引1:行索引x], 列索引 ]]
-
范围筛选可以和多条筛选混用: DataFrame.iloc[[行索引1:行索引x], [‘列索引1’,‘列索引2’, …]]
-
⚠️ 注意 :
-
开始和结束的范围,必须用
:英文冒号分隔! -
索引范围,不能用 [ ] 方括号包裹!
-
左闭右开: 在使用范围筛选时,需要注意,范围筛选遵循
Python切片的左闭右开原则。例如你传递了[0:5]的范围,这个范围的实际位置区间是0 ≤ 位置 < 5例4
-
-
4、布尔筛选
-
DataFrame.iloc[行掩码列表,列掩码列表]
- 掩码筛选: 可以传递一个与行索引长度相同的
布尔列表表示哪些行留下(True对应的位置留下),哪些行舍弃(False对应的位置舍弃)。例5
- 掩码筛选: 可以传递一个与行索引长度相同的
5、Callable 筛选
-
DataFrame.iloc[Callable]
可以使用
Callable进行筛选,原理上这也是一种布尔筛选。 例6⛔ 弃用于 Pandas 2.1.0 : 通过
Callable获取元组tuple的方法已弃用。
相关方法:
➡️ 相关方法
Access a single value for a row/column label pair.
筛选数据-标签法
Access group of values using labels.
示例:
测试文件下载:
本文所涉及的测试文件,如有需要,可在文章顶部的绑定资源处下载。
若发现文件无法下载,应该是资源包有内容更新,正在审核,请稍后再试。或站内私信作者索要。

- 1、筛选1行,默认返回
Series,把筛选条件套上 [ ],可以强制返回DataFrame。
import pandas as pd
# 构建DF
df = pd.DataFrame([[1, 2], [4, 5], [7, 8]],
index=['cobra', 'viper', 'sidewinder'],
columns=['max_speed', 'shield'])
# 筛选'cobra'行,其索引位置是0,默认返回Series
df.iloc[0]
# ... max_speed 1
# ... shield 2
# ... Name: cobra, dtype: int64
# 单行筛选,条件套上[ ],强制返回 DataFrame
df.iloc[[0]]
# ... max_speed shield
# ... cobra 1 2
- 2、筛选1列,默认返回
Series,把筛选条件套上 [ ],可以强制返回DataFrame。
# 筛选'max_speed'列,其列名索引位置是0,默认返回Series
# df.iloc[:,0]
# ... cobra 1
# ... viper 4
# ... sidewinder 7
# ... Name: max_speed, dtype: int64
# 筛选'max_speed'列,条件套上[ ],强制返回 DataFrame
df.iloc[:,[0]]
# ... max_speed
# ... cobra 1
# ... viper 4
# ... sidewinder 7
- 3、筛选单元格,默认返回标量值
Scalar,把筛选条件套上 [ ],可以强制返回DataFrame。
# 常规单元格筛选,返回标量值
df.iloc[0, 0]
# ... 1
# 把筛选条件套上 [ ],可以强制返回 DataFrame
df.iloc[[0], [0]]
# ... max_speed
# ... cobra 1
- 1、构建演示数据并观察数据内容
import pandas as pd
# 构建演示数据
tuples = [
('射手', '巨魔族'), ('射手', '死灵族'),
('法师', '巨魔族'), ('法师', '死灵族'),
('战士', '巨魔族'), ('战士', '死灵族')
]
index = pd.MultiIndex.from_tuples(tuples)
values = [[9, 20], [10, 18], [7, 23],
[6, 25], [4, 30], [3, 35]]
df = pd.DataFrame(values, columns=[['属性1','属性2'], ['攻速','攻击力']], index=index)
# 观察数据内容
df
| 属性1 | 属性2 | ||
|---|---|---|---|
| 攻速 | 攻击力 | ||
| 射手 | 巨魔族 | 9 | 20 |
| 死灵族 | 10 | 18 | |
| 法师 | 巨魔族 | 7 | 23 |
| 死灵族 | 6 | 25 | |
| 战士 | 巨魔族 | 4 | 30 |
| 死灵族 | 3 | 35 |
- 2、筛选1行、或1列、或某个单元格
# 筛选第1行,默认返回Series
df.iloc[0]
# ... 属性1 攻速 9
# ... 属性2 攻击力 20
# ... Name: (射手, 巨魔族), dtype: int64
# 筛选第1列,默认返回Series
df.iloc[:,0]
# ... 射手 巨魔族 9
# ... 死灵族 10
# ... 法师 巨魔族 7
# ... 死灵族 6
# ... 战士 巨魔族 4
# ... 死灵族 3
# 筛选第1个单元格,默认返回标量值
df.iloc[0,0]
# ... 9
- 3、多层索引的DataFrame,如果想强制返回DataFrame,可以用[ ]把筛选条件套起来
# 筛选第1个单元格,默认返回标量值,用[ ]把筛选条件套起来强制返回DataFrame
df.iloc[[0],[0]]
# ... 属性1
# ... 攻速
# ... 射手 巨魔族 9
import pandas as pd
# 构建DF
df = pd.DataFrame([[1, 2], [4, 5], [7, 8]],
index=['cobra', 'viper', 'sidewinder'],
columns=['max_speed', 'shield'])
# 筛选多行
df.iloc[[0, 1]]
# ... max_speed shield
# ... cobra 1 2
# ... viper 4 5
# 筛选多行、单列
df.iloc[[0, 1],0]
# ... cobra 1
# ... viper 4
# ... Name: max_speed, dtype: int64
# 筛选多行、多列
df.iloc[[0, 1],[0, 1]]
# ... max_speed shield
# ... cobra 1 2
# ... viper 4 5
例4:范围筛选,以及和其他形式筛选的混用。注意左闭右开原则对右边界索引值的影响
import pandas as pd
# 构建DF
df = pd.DataFrame([[1, 2], [4, 5], [7, 8]],
index=['第1行', '第2行', '第3行'],
columns=['第1列', '第2列'])
# 筛选第1行到第2行
df.iloc[0:2]
# ... 第1列 第2列
# ... 第1行 1 2
# ... 第2行 4 5
# 筛选第1列到第2列
df.iloc[:,0:2]
# ... 第1列 第2列
# ... 第1行 1 2
# ... 第2行 4 5
# ... 第3行 7 8
# 筛选第1行到第2行,+ 筛选第1列到第2列
df.iloc[0:2,0:2]
# ... 第1列 第2列
# ... 第1行 1 2
# ... 第2行 4 5
# 筛选第1行到第2行 + 第1列 强制返回DataFrame,
# df.iloc[0:2,[0]] # 0:2是个范围,不能套[ ]
# ... 第1列
# ... 第1行 1
# ... 第2行 4
# 筛选第1行到第2行 + 筛选第1列和第2列
# df.iloc[0:2,[0,1]]
# ... 第1列 第2列
# ... 第1行 1 2
# ... 第2行 4 5
例5:使用由布尔值组成的掩码列表,表示哪些行或哪些列被筛选。
import pandas as pd
# 构建DF
df = pd.DataFrame([[1, 2], [4, 5], [7, 8]],
index=['第1行', '第2行', '第3行'],
columns=['第1列', '第2列'])
# 筛选第1行和第3行
list_mask = [True, False, True]
df.iloc[list_mask]
# ... 第1列 第2列
# ... 第1行 1 2
# ... 第2行 7 8
# 筛选第1行和第3行 + 第1列
list_mask_line = [True, False, True]
list_mask_col = [True, True]
df.iloc[list_mask_line, list_mask_col]
# ... 第1列 第2列
# ... 第1行 1 2
# ... 第2行 7 8
import pandas as pd
# 构建DF
df = pd.DataFrame([[1, 2], [4, 5], [7, 8]],
index=['第1行', '第2行', '第3行'],
columns=['第1列', '第2列'])
# 筛选第1行
df.iloc[lambda x: x.index == '第1行']
# ... 第1列 第2列
# ... 第1行 1 2
# 筛选所有、第1列
df.iloc[:,lambda x: x.columns == '第1列']
# ... 第1列
# ... 第1行 1
# ... 第2行 4
# ... 第3行 7
import pandas as pd
# 构建演示数据
df = pd.DataFrame([[1, 2], [4, 5], [7, 8]],
index=['cobra', 'viper', 'sidewinder'],
columns=['移速', '护甲'])
# 筛选后,批量修改数据
df.iloc[[1,2]] = 50
df
# ... 移速 护甲
# ... cobra 1 2
# ... viper 50 50
# ... sidewinder 50 50
本文详细介绍了PandasDataFrame的.iloc[]方法,包括单行、单列、多行多列筛选,范围筛选,布尔筛选和Callable筛选,以及如何在筛选后进行数据赋值。适合理解和掌握Pandas数据处理的进阶用户。
1万+

被折叠的 条评论
为什么被折叠?



