在 pandas 数据框中保留包含文本的列

问题描述 投票:0回答:2

我想保留包含单词“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)
python pandas dataframe
2个回答
2
投票

使用

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

1
投票

布尔索引

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]]
© www.soinside.com 2019 - 2024. All rights reserved.