Pandas 的 布尔索引(Boolean Indexing)
🧩 一、data[ ... ] 是什么数据访问方式?
这是 Pandas 的 布尔索引(Boolean Indexing),也叫 条件筛选(Conditional Selection)。
✅ 作用:
从 DataFrame data 中,筛选出满足括号内条件的行,返回一个新的 DataFrame。
📌 语法结构:
df[ 布尔条件 ]
→ 布尔条件必须是一个 与 df 行数相同的布尔型 Series(True/False)
📊 二、中括号里的表达式 (data[1] == 'ab') & (data['sex'] == 'male') 是什么结果?
它返回一个 布尔型 Series(pandas.Series of bool),长度等于 DataFrame 的行数,每个元素表示“该行是否满足条件”。
🔍 举例说明:
假设 data 是:
import pandas as pd
data = pd.DataFrame({
1: ['ab', 'cd', 'ab', 'ef'], # ← 注意:列名是整数 1
'sex': ['male', 'female', 'male', 'male'],
'age': [25, 30, 35, 28]
})
→ 注意:第一列的列名是 1(整数),不是字符串 '1'
那么:
步骤 1:
data[1] == 'ab'>>> data[1] == 'ab'
0 True # 第0行:'ab' == 'ab' → True
1 False # 第1行:'cd' == 'ab' → False
2 True # 第2行:'ab' == 'ab' → True
3 False # 第3行:'ef' == 'ab' → False
Name: 1, dtype: bool
→ 返回一个布尔 Series,索引与原 DataFrame 一致
步骤 2:data['sex'] == 'male'
>>> data['sex'] == 'male'
0 True
1 False
2 True
3 True
Name: sex, dtype: bool
步骤 3:(data[1] == 'ab') & (data['sex'] == 'male')
→ 对两个布尔 Series 做“按位与”运算(element-wise AND)
>>> (data[1] == 'ab') & (data['sex'] == 'male')
0 True # True & True → True
1 False # False & False → False
2 True # True & True → True
3 False # False & True → False
dtype: bool
✅ 最终结果是一个布尔 Series:
[True, False, True, False] 🎯 三、
data[ 布尔Series ] 做了什么?Pandas 会:
遍历这个布尔 Series
- 对应位置为
True的行 → 保留 - 对应位置为
False的行 → 丢弃 - 返回一个新的 DataFrame(不修改原数据)
所以:
python
filter_data = data[ (data[1] == 'ab') & (data['sex'] == 'male') ]
→ 会返回第 0 行和第 2 行:
1 sex age
0 ab male 25
2 ab male 35
📚 四、data[ ] 的几种常见用法对比
⚠️ 注意:
data[0:2]是按行号切片,不是按标签 —— 容易混淆,推荐用.iloc[0:2]替代
✅ 五、完整可运行示例
⌄
import pandas as pd
# 创建数据,列名包含整数 1
data = pd.DataFrame({
1: ['ab', 'cd', 'ab', 'ef'],
'sex': ['male', 'female', 'male', 'male'],
'age': [25, 30, 35, 28]
})
print("=== 原始数据 ===")
print(data)
# 构造布尔条件
condition = (data[1] == 'ab') & (data['sex'] == 'male')
print("\n=== 布尔条件结果 ===")
print(condition)
# 执行筛选
filter_data = data[condition]
print("\n=== 筛选后数据 ===")
print(filter_data)
=== 原始数据 ===
1 sex age
0 ab male 25
1 cd female 30
2 ab male 35
3 ef male 28
=== 布尔条件结果 ===
0 True
1 False
2 True
3 False
dtype: bool
=== 筛选后数据 ===
1 sex age
0 ab male 25
2 ab male 35
🧠 六、关键概念总结
💡 七、实用技巧 & 建议
1. 调试时,先打印条件结果:
cond = (data[1] == 'ab') & (data['sex'] == 'male')
print(cond) # 确认是不是你想要的 True/False 分布
2. 使用 .query() 更清晰(推荐):
# 假设你把列 1 重命名为 'group'
data.columns = ['group', 'sex', 'age']
filter_data = data.query("group == 'ab' and sex == 'male'")
3. 避免使用数字作列名:
data.rename(columns={1: 'group'}, inplace=True) # 改为有意义的列名
✅ 最终一句话总结:
data[ (data[1] == 'ab') & (data['sex'] == 'male') ]
→ 括号内生成一个布尔序列,data[ ]根据该序列筛选行,返回满足条件的子集 DataFrame。
这是 Pandas 最核心、最常用的筛选操作之一,掌握它,你就掌握了数据清洗和分析的钥匙!

浙公网安备 33010602011771号