如何查找与所有列的给定条件集匹配的 DataFrame 行?

时间:2021-06-30 22:41:03

标签: python pandas data-analysis

给定以下 Pandas DataFrame,如何获取 Test1 和 Test2 失败的所有行?在我的真实数据集中,我有大约 70 个不同的测试,需要一种简单的方法来根据它们失败的不同测试过滤设备。

import pandas as pd

data = [['SN-01', 'Fail', 'Pass', 'Pass'], 
        ['SN-02', 'Pass', 'Fail', 'Pass'], 
        ['SN-03', 'Fail', 'Fail', 'Pass'],
        ['SN-04', 'Fail', 'Fail', 'Fail']]

df = pd.DataFrame(data, columns = ['Serial', 'Test1', 'Test2', 'Test3'])

Out[133]: 
  Serial Test1 Test2 Test3
0  SN-01  Fail  Pass  Pass
1  SN-02  Pass  Fail  Pass
2  SN-03  Fail  Fail  Pass
3  SN-04  Fail  Fail  Fail

如果我尝试以下

df.loc[(df.Test1 == "Fail") & (df.Test2 == "Fail"), 'Serial']
Out[132]: 
2    SN-03
3    SN-04
Name: Serial, dtype: object

我得到 SN-03 和 SN-04 作为输出,但正确答案只有 SN-03。有没有办法创建一个布尔掩码并将其应用于每一行并在它们真正匹配时过滤它们?获得结果的正确 Pythonic/Panda 方法是什么?

更新 我找到了一个解决方案,但感觉不是 Pythonic。有没有内置的解决方案通过将每一行与掩码进行比较来过滤行?

#Replace pass/fail string with boolean, note fail is True here
df = df.replace({"Pass":False, "Fail":True})
#get all rows which have exactly 2 failed tests
mask = df.sum(axis = 1)==2
#use the mask to get subset of rows.
df2 = df[mask]
#now filter for 2 or more specific tests we care about.    
z = df2.loc[(df2['Test1'] == True) & (df2['Test2'] == True), 'Serial' ]

2 个答案:

答案 0 :(得分:0)

这是一种方法:

cols = ['Test1','Test2']
d = df.set_index('Serial').eq('Pass')
d[cols].sum(axis=1).eq(0) & d.sum(axis=1).eq(len(d.columns)-len(cols))

答案 1 :(得分:0)

您可以遍历数据框检查列 Test1Test2Test3 是否等于 "Fail""Fail"、{{1} }, 分别。然后,使用 "Pass" 获取符合该条件的行。最后,选择 loc 列:

"Serial"

输出:

df.loc[df.apply(lambda x: np.equal(x.loc["Test1":], ['Fail', 'Fail', 'Pass']).all(), axis=1) == True]["Serial"]
相关问题