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

如何用Pandas筛选Excel中NOK状态并填充Issue列?

问题

我是Python新手,现在需要用Pandas处理Excel表格,目标是创建仅包含"NOK"状态的DataFrame,并根据该状态获取对应验证模块名称填充至Issue列。由于各验证模块的列数不固定,不知道怎么遍历行来获取每个验证的准确状态。

已执行以下代码读取Excel文件:

import pandas as pd
df = pd.read_excel('C:\Excel_Query.xlsx', header=[0,2])
df.to_dict()

得到的字典结果如下:

{('Key', 'werwer'): {0: 'qweqwe', 1: 'ertert'},
 ('site', 1232): {0: 2424, 1: 68678},
 ('work order', 1): {0: 2, 1: 3},
 ('project', 11): {0: 22, 1: 33},
 ('start date', 'Unnamed: 4_level_1'): {0: nan, 1: nan},
 ('end date', 'Unnamed: 5_level_1'): {0: nan, 1: nan},
 ('duration', 'Unnamed: 6_level_1'): {0: nan, 1: nan},
 ('Software Center', 'Status'): {0: 'NOK', 1: 'OK'},
 ('Software Center', 'Validate'): {0: 0, 1: 0},
 ('Software Center', 'Confirm'): {0: 'NOK', 1: 0},
 ('Test training', 'Status'): {0: 'NOK', 1: 'OK'},
 ('Test training', 'Validate'): {0: 'NOK', 1: 0},
 ('Test training', 'Check'): {0: 'NOK', 1: 0},
 ('Test training', 'Check2'): {0: 'NOK', 1: 0},
 ('Test training', 'Config'): {0: nan, 1: 0.0},
 ('Test training', 'Config2'): {0: nan, 1: 0.0},
 ('Test training', 'Issue'): {0: nan, 1: 0.0},
 ('Work Release', 'Status'): {0: 'OK', 1: 'NOK'},
 ('Work Release', 'Check'): {0: 0, 1: 'OK'},
 ('Work Release', 'Vendor'): {0: 0, 1: 'OK'},
 ('Work Release', 'Issue'): {0: 0, 1: 'OK'},
 ('Work Release', 'Swap'): {0: 0.0, 1: nan},
 ('Work Release', 'Swap.1'): {0: nan, 1: nan},
 ('Issue 1', 'Unnamed: 23_level_1'): {0: 'Software Center', 1: 'Work Release'},
 ('Issue2', 'Unnamed: 24_level_1'): {0: 'Test training', 1: nan},
 ('Issue 3', 'Unnamed: 25_level_1'): {0: nan, 1: nan}}

最终需求:筛选出所有Status为"NOK"的项,并将对应模块名称填充到Issue列。


解决方案

核心思路

不用遍历所有行和列,先从多级表头中定位所有Status列,再逐行检查这些列的值,收集对应模块名称即可,完美适配模块列数不固定的情况。

完整实现代码

import pandas as pd

# 读取Excel,用原始字符串避免路径转义问题
df = pd.read_excel(r'C:\Excel_Query.xlsx', header=[0,2])

# 筛选所有二级表头为"Status"的列(对应各模块的状态列)
status_columns = [col for col in df.columns if col[1] == 'Status']

# 定义函数:提取当前行所有Status为NOK的模块名称
def extract_nok_modules(row):
    nok_modules = []
    for col in status_columns:
        if row[col] == 'NOK':
            nok_modules.append(col[0])  # col[0]是模块名称
    return ', '.join(nok_modules) if nok_modules else pd.NA

# 生成Issue列
df['Issue'] = df.apply(extract_nok_modules, axis=1)

# 筛选出至少有一个NOK状态的行(按需选择)
nok_result = df[df['Issue'].notna()].copy()

# 可选:整理列,把多级表头简化为普通表头
nok_result = nok_result[
    [('Key', 'werwer'), ('site', 1232), ('work order', 1), ('project', 11), 'Issue']
]
nok_result.columns = ['Key', 'Site', 'Work Order', 'Project', 'Issue']

# 查看结果
print(nok_result)

代码说明

  1. 路径处理:用r'C:\Excel_Query.xlsx'原始字符串,避免Windows路径的转义错误。
  2. 定位Status列:通过列表推导式筛选出所有二级表头为Status的列,不管模块有多少列,都能准确找到状态列。
  3. 生成Issue列:用apply逐行处理,收集所有NOK的模块名称,用逗号拼接成字符串;如果没有NOK则返回空值。
  4. 筛选结果:过滤掉Issue列为空的行,只保留有NOK状态的记录。
  5. 列整理:可选步骤,把多级表头的列重命名为简洁名称,方便查看。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.26 00:05:11