如何用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)
代码说明
- 路径处理:用
r'C:\Excel_Query.xlsx'原始字符串,避免Windows路径的转义错误。 - 定位Status列:通过列表推导式筛选出所有二级表头为
Status的列,不管模块有多少列,都能准确找到状态列。 - 生成Issue列:用
apply逐行处理,收集所有NOK的模块名称,用逗号拼接成字符串;如果没有NOK则返回空值。 - 筛选结果:过滤掉Issue列为空的行,只保留有NOK状态的记录。
- 列整理:可选步骤,把多级表头的列重命名为简洁名称,方便查看。
内容的提问来源于stack exchange,提问作者Dee
相关产品推荐
相关产品推荐

