在数据分析的实际工作中,我们常常需要从数据集中筛选出同时满足多个条件或者满足其中部分条件的数据,这时候就需要用到多条件真值的组合操作。Pandas和NumPy作为Python数据分析的核心工具,都提供了完善的逻辑运算能力来处理这类需求,合理运用可以大幅提升筛选效率。

基础逻辑运算符说明
NumPy和Pandas都支持标准的逻辑运算符,用于组合布尔类型的数组或者Series,常见的运算符及对应的位运算符如下:
| 逻辑含义 | Python逻辑运算符 | NumPy/Pandas位运算符 |
|---|---|---|
| 与(同时满足) | and | & |
| 或(满足其一) | or | | |
| 非(取反) | not | ~ |
需要注意的是,在组合Pandas的布尔Series或者NumPy布尔数组时,不能直接使用and、or、not,因为这些运算符只能处理单个布尔值,处理数组时会报错,必须使用对应的位运算符。
NumPy组合多条件真值的方法
NumPy的布尔数组可以直接通过位运算符组合,每个条件需要用括号包裹,避免运算优先级问题。下面是一个简单的示例:
import numpy as np # 创建示例数组 arr = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]) # 定义两个条件:大于3且小于8 cond1 = arr > 3 cond2 = arr < 8 # 组合条件:同时满足两个条件 combined_cond = (cond1) & (cond2) # 筛选数据 result = arr[combined_cond] print(result) # 输出 [4 5 6 7]
如果需要组合多个条件,只需要依次用位运算符连接即可,比如同时满足三个条件的写法为(cond1) & (cond2) & (cond3),满足其中两个条件的写法为(cond1) | (cond2)。
Pandas组合多条件真值的方法
Pandas的Series和DataFrame的布尔筛选逻辑和NumPy类似,同样使用位运算符组合条件,下面以DataFrame为例演示:
import pandas as pd
import numpy as np
# 创建示例DataFrame
df = pd.DataFrame({
'name': ['张三', '李四', '王五', '赵六', '钱七'],
'age': [22, 35, 28, 40, 19],
'score': [85, 92, 78, 88, 95]
})
# 定义两个条件:年龄大于25,且分数大于80
cond_age = df['age'] > 25
cond_score = df['score'] > 80
# 组合条件筛选
filtered_df = df[(cond_age) & (cond_score)]
print(filtered_df)
上述代码会筛选出年龄大于25且分数大于80的行,输出结果包含李四和赵六两条数据。
复杂条件组合技巧
当条件比较复杂时,可以使用np.where或者Pandas的query方法简化逻辑。比如需要根据多个条件生成新的列:
import pandas as pd
import numpy as np
df = pd.DataFrame({
'value': [10, 25, 35, 45, 55]
})
# 多条件判断生成新列:小于20为低,20-40为中,大于40为高
df['level'] = np.where(
(df['value'] < 20),
'低',
np.where(
(df['value'] >= 20) & (df['value'] <= 40),
'中',
'高'
)
)
print(df)
另外Pandas的query方法支持直接传入字符串形式的条件,适合条件较多的情况:
import pandas as pd
df = pd.DataFrame({
'age': [22, 35, 28, 40, 19],
'score': [85, 92, 78, 88, 95]
})
# 用query方法组合条件
result = df.query('age > 25 and score > 80')
print(result)
性能对比与注意事项
在处理大规模数据时,NumPy的向量化运算比循环判断效率高很多,而Pandas的布尔索引底层也是基于NumPy实现的,因此组合条件时尽量使用向量化的位运算方式。需要注意的点有:
- 每个独立的条件必须用括号包裹,避免运算优先级错误,比如
(a > 1) & (b < 3)不能写成a > 1 & b < 3 - 取反操作使用
~,比如筛选不满足某个条件的写法为df[~(df['age'] > 25)] - 如果条件中包含NaN值,需要先用
pd.notna()或者np.isnan()处理,避免筛选结果异常
多条件真值组合是数据筛选的基础操作,熟练掌握Pandas和NumPy的对应方法,可以让你在处理各类数据筛选需求时更加高效准确。