如何高效筛选DataFrame中place为空的行并实现多列条件校验?
Pandas 高效处理空值行的多列校验与统计
原始数据构建
先还原你的DataFrame:
import pandas as pd import numpy as np df = pd.DataFrame({ 'ID': [1,2,3,4], 'place': [1, np.nan, np.nan, 1], 'stock': [4,2,np.nan,1] })
核心解决方案:矢量化布尔索引
完全不需要循环,用Pandas的矢量化操作就能高效完成筛选、校验和统计,且天然支持多列扩展:
1. 单条件校验(示例:place为空且stock>0)
# 构建筛选掩码:同时满足place为空、stock>0 mask = df['place'].isna() & (df['stock'] > 0) # 统计符合条件的行数 valid_count = mask.sum() # 查看具体符合条件的行 valid_rows = df[mask] print(valid_count) # 输出:1
2. 多列校验通用方案
如果需要同时校验10余列的条件,直接通过&(逻辑与)或|(逻辑或)组合多个条件即可;如果是批量列需要满足同一规则,可批量生成条件:
方式1:手动组合多列条件
假设新增quantity列,需要校验place为空 + stock>0 + quantity>1:
df['quantity'] = [1,3,np.nan,2] mask_multi = df['place'].isna() & (df['stock'] > 0) & (df['quantity'] > 1) count_multi = mask_multi.sum()
方式2:批量处理同规则列
如果有一批列(比如stock、quantity、sales)都需要满足>0,可以用all()/any()批量生成条件:
# 指定需要校验的列 check_cols = ['stock', 'quantity'] # 生成批量条件:所有指定列都>0 cols_condition = df[check_cols].gt(0).all(axis=1) # 组合总条件:place为空 + 所有指定列符合规则 mask_batch = df['place'].isna() & cols_condition count_batch = mask_batch.sum()
优势说明
- 性能远优于循环:矢量化操作基于底层C实现,处理大数据集时速度比Python循环快10~100倍
- 代码简洁易维护:多列扩展只需添加条件或修改校验列列表,无需修改循环逻辑
- 可读性强:直接用布尔表达式表达业务规则,逻辑清晰
内容的提问来源于stack exchange,提问作者user8793002
相关产品推荐
相关产品推荐

