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
  1. 对应位置为 True 的行 → 保留
  2. 对应位置为 False 的行 → 丢弃
  3. 返回一个新的 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[col_name]
列名
取某一列(Series)
data['sex']
data[list_of_cols]
列名列表
取多列(DataFrame)
data[['sex', 'age']]
data[bool_series]
布尔 Series
按行筛选(Boolean Index)
data[data['age'] > 30]
data[start:end]
整数切片
按行号切片(不推荐)
data[0:2]

⚠️ 注意: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
 
  

 

🧠 六、关键概念总结

  
data[1]
访问列名为1的列(整数列名),不是第1行!
==
比较运算符,返回布尔值
&
按位与,用于组合多个布尔条件,必须加括号
布尔 Series
由 True/False 组成的序列,长度 = DataFrame 行数
布尔索引
df[bool_series]→ 保留 bool_series 中为 True 的行
不修改原数据
返回新 DataFrame,原data不变

 

💡 七、实用技巧 & 建议

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 最核心、最常用的筛选操作之一,掌握它,你就掌握了数据清洗和分析的钥匙!

posted @ 2025-09-07 13:28  七星望  阅读(58)  评论(0)    收藏  举报