给定以下 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' ]
答案 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)
您可以遍历数据框检查列 Test1
、Test2
和 Test3
是否等于 "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"]