我想保留包含单词“FAIL”的列。
输入数据:
价值观1 | 价值观2 | 价值观3 | 状态1 | 状态2 | 状态3 |
---|---|---|---|---|---|
1 | 1 | 1 | 通过 | 通过 | 失败 |
2 | 2 | 2 | 通过 | 通过 | 通过 |
3 | 3 | 3 | 通过 | 通过 | 通过 |
4 | 4 | 4 | 通过 | 失败 | 通过 |
预期输出:
状态2 | 状态3 |
---|---|
通过 | 失败 |
失败 | 通过 |
电流输出:
状态1 | 状态2 | 状态3 |
---|---|---|
通过 | 通过 | 失败 |
通过 | 失败 | 通过 |
我的代码:
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)
DataFrame.loc
按掩码过滤行和列,如果需要按列表过滤,请使用 DataFrame.isin
,如果需要过滤标量,请使用 DataFrame.eq
和 DataFrame.any
测试至少一个匹配项:
words_to_keep = ["FAIL"]
m = df.isin(words_to_keep)
#m = df.eq("FAIL")
out = df.loc[m.any(axis=1), m.any()]
print (out)
Status2 Status3
0 PASS FAIL
3 FAIL PASS
详情:
print (df.isin(words_to_keep))
Values1 Values2 Values3 Status1 Status2 Status3
0 False False False False False True
1 False False False False False False
2 False False False False False False
3 False False False False True False
print (m.any(axis=1))
0 True
1 False
2 False
3 True
print (m.any())
Values1 False
Values2 False
Values3 False
Status1 False
Status2 True
Status3 True
dtype: bool
将 布尔索引 与
any
:
df.loc[:, df.eq('FAIL').any()]
# or for multiple words
# the mask doesn't matter as long
# as you have True/False
df.loc[:, df.isin(['FAIL']).any()]
输出:
Status2 Status3
0 PASS FAIL
1 PASS PASS
2 PASS PASS
3 FAIL PASS
工作原理:
df.eq('FAIL').any()
Values1 False
Values2 False
Values3 False
Status1 False
Status2 True
Status3 True
dtype: bool
# which is equivalent to
df.loc[:, [False, False, False, False, True, True]]