如何修正Pandas代码,筛选包含"FAIL"的DataFrame列与行?
问题:保留Pandas DataFrame中包含"FAIL"的行和列
输入数据
| Values1 | Values2 | Values3 | Status1 | Status2 | Status3 |
|---|---|---|---|---|---|
| 1 | 1 | 1 | PASS | PASS | FAIL |
| 2 | 2 | 2 | PASS | PASS | PASS |
| 3 | 3 | 3 | PASS | PASS | PASS |
| 4 | 4 | 4 | PASS | FAIL | PASS |
预期输出
| Status2 | Status3 |
|---|---|
| PASS | FAIL |
| FAIL | PASS |
当前输出
| Status1 | Status2 | Status3 |
|---|---|---|
| PASS | PASS | FAIL |
| PASS | FAIL | PASS |
原代码
import pandas as pd values = range(1,5) status_pass = ["PASS"]*len(values) status1 = status_pass[1:]+["FAIL"] status2 = status1[::-1] df = pd.DataFrame({"Values1":values,"Values2":values,"Values3":values,"Status1":status_pass,"Status2":status1,"Status3":status2}) # drop unwanted rows words_to_keep = ["FAIL"] df = df[df.stack().groupby(level=0).apply( lambda x: all(x.str.contains(w, case=False).any() for w in words_to_keep))] # Filter by column name df = df.filter(like='Status', axis=1)
修正方案
原代码的问题在于列筛选仅保留了名称含"Status"的列,但没有过滤掉那些不包含"FAIL"值的Status列(比如Status1全为PASS)。下面是修正后的代码:
import pandas as pd values = range(1,5) status_pass = ["PASS"]*len(values) status1 = status_pass[1:]+["FAIL"] status2 = status1[::-1] df = pd.DataFrame({"Values1":values,"Values2":values,"Values3":values,"Status1":status_pass,"Status2":status1,"Status3":status2}) # 筛选包含"FAIL"的行:每行至少有一个"FAIL" rows_with_fail = df.isin(["FAIL"]).any(axis=1) df = df[rows_with_fail] # 筛选包含"FAIL"的列:每列至少有一个"FAIL" cols_with_fail = df.isin(["FAIL"]).any(axis=0) df = df.loc[:, cols_with_fail]
关键步骤说明
- 行筛选:
df.isin(["FAIL"]).any(axis=1)生成布尔序列,标记每行是否存在"FAIL"值,据此保留符合条件的行。 - 列筛选:
df.isin(["FAIL"]).any(axis=0)生成布尔序列标记每列是否存在"FAIL"值,仅保留这些列。
内容的提问来源于stack exchange,提问作者Gооd_Mаn
相关产品推荐
相关产品推荐

