Я хотел бы сохранить столбцы, содержащие слово «FAIL».
Входные данные:
Ожидаемый результат:
Текущий выход:
Мой код:
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)






Используйте логическое индексирование с любым:
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(words_to_keep).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]]
Используйте DataFrame.loc для фильтрации строк и столбцов по маске, если нужно фильтровать по списку, используйте DataFrame.isin , если нужен скаляр фильтра, используйте DataFrame.eq с DataFrame.any для проверки at хотя бы одно совпадение:
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