You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas如何处理空单元格 实现空值匹配任意参数的DataFrame筛选

pandas实现带空值通配的多列参数匹配筛选

需求说明

现有存储业务数据的pandas DataFrame,表结构分为两类列:

  • 物料必填参数列:列名统一带_required后缀
  • 库存物料参数列:列名统一带_stock后缀
    需要对比两组参数筛选符合要求的库存物料,筛选规则:
  • 若某行的必填参数单元格为空值,则该参数视为可匹配任意对应库存参数值
  • DataFrame支持存储字符串、整数、布尔值等任意类型数据

问题复现

原有筛选逻辑直接对同名字段做相等判断,代码如下:

import pandas as pd
import numpy as np
df = pd.DataFrame( {'id' : [1, 1, 2, 2, 2],
                    'х_required' : ['metall', 'metall', np.nan, np.nan, np.nan],
                    'y_required' : [10, 10, 7, 7, 7],
                    'х_stock' : ['metall', 'metall', 'wood', 'plastic', 'metall'],
                    'y_stock' : [9, 10, 5, 7, 7] } )
# 原有错误筛选逻辑
df = df[df['х_required'] == df['х_stock']]
df = df[df['y_required'] == df['y_stock']]
print(df)

运行后输出结果不符合预期:

id х_required  y_required х_stock  y_stock
1   1     metall          10  metall       10

预期符合空值匹配规则的输出结果:

id х_required  y_required х_stock  y_stock
1   1     metall        10.0  metall       10
3   2     NaN           7     plastic      7
4   2     NaN           7     metall       7

原有逻辑的问题:pandas中np.nan与任何值做相等比较都会返回False,导致必填列为空的行全部被错误过滤。

实现代码

核心逻辑:每对参数的匹配条件为「必填列为空 或 两列值相等」,所有参数对的条件同时满足时保留该行,代码自动识别所有参数对,无需硬编码列名,适配任意多组参数场景:

import pandas as pd
import numpy as np

df = pd.DataFrame( {'id' : [1, 1, 2, 2, 2],
                    'х_required' : ['metall', 'metall', np.nan, np.nan, np.nan],
                    'y_required' : [10, 10, 7, 7, 7],
                    'х_stock' : ['metall', 'metall', 'wood', 'plastic', 'metall'],
                    'y_stock' : [9, 10, 5, 7, 7] } )

# 提取所有必填参数列
required_cols = [col for col in df.columns if col.endswith('_required')]
# 初始化筛选掩码为全True
filter_mask = pd.Series(True, index=df.index)

for req_col in required_cols:
    stock_col = req_col.replace('_required', '_stock')
    # 单参数匹配规则:必填为空则通配,否则值相等才匹配
    col_match = df[req_col].isna() | (df[req_col] == df[stock_col])
    filter_mask &= col_match

result = df[filter_mask]
print(result)

运行输出与预期完全一致:

id х_required  y_required х_stock  y_stock
1   1     metall        10.0  metall       10
3   2        NaN         7.0  plastic        7
4   2        NaN         7.0   metall        7

提示:如果数据中存在空值格式不统一的情况(比如同时存在np.nan、None、空字符串''),可以先执行df = df.replace('', np.nan)统一空值格式,避免匹配异常。

内容的提问来源于stack exchange,提问作者EgorSilianov

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 02:18:04