查找同时满足两个条件的行

Finding rows which match both conditions

假设我有一个数据框:

Do Re Mi Fa So
1 0 Foo 100 50
1 1 Bar 75 20
0 0 True 59 59
1 1 False 0 12

我如何找到“Do”和“Re”列中的值都等于 1 且“Fa”高于“So”的所有行?

我已经尝试了几种方法,但他们首先 returns 抱怨歧义的错误: df['both_1']=((df['Do'] > df['Re']) & (df['Mi'] == df['Fa'] == 1))

我也尝试将其分解为多个步骤,但我意识到最后一步将导致我同时引入 True 和 False 语句。我只想要 True.

    
    df['Do_1'] = df['Do'] == 1
    
    df['Re_1'] = df['Re'] == 1
    
    # This is where I realised I'm bringing in the False rows too
    df['both_1'] = (df['Do1'] == df['Re_1'])```

按位 & 的另一个 & 链掩码 AND:

df['both_1']= (df['Fa'] > df['So']) & (df['Do'] == 1) & (df['Re'] == 1)

print (df)
   Do  Re     Mi   Fa  So  both_1
0   1   0    Foo  100  50   False
1   1   1    Bar   75  20    True
2   0   0   True   59  59   False
3   1   1  False    0  12   False

或者如果可能的话,列表中的多列按子集 df[['Do', 'Re']] 过滤列,并按 DataFrame.all 测试所有真值:

df['both_1']= (df['Fa'] > df['So']) & (df[['Do', 'Re']] == 1).all(axis=1)

如果需要过滤器使用boolean indexing:

df1 = df[(df['Fa'] > df['So']) & (df['Do'] == 1) & (df['Re'] == 1)]

第二个解决方案:

df1 = df[(df['Fa'] > df['So']) & (df[['Do', 'Re']] == 1).all(axis=1)]

您可以使用 &(按位与)组合三个条件:

df[(df['Do'] == 1) & (df['Re'] == 1) & (df['Fa'] > df['So'])]

输出(对于您的示例数据):

   Do  Re    Mi  Fa  So
1   1   1  Bar   75  20

尝试:

import numpy as np
import pandas as pd

df = pd.DataFrame({'Do':[1,1,0,1],'Re':[0,1,0,1],'Mi':['Foo','Bar',True,False],'Fa':[100,75,59,0],'Sol':[50,20,59,12]})

df.loc[np.where((df.Do == 1) & (df.Re ==1) & (df.Fa > df.Sol))[0]]

Output:
   Do  Re   Mi  Fa  Sol
    1   1   1  Bar  75   20

If you do not want to import anything else, just do this:

df.assign(keep=[1 if (df.loc[i,'Do'] == 1 and df.loc[i,'Re'] == 1 and df.loc[i,'Fa'] > df.loc[i,'Sol']) else 0 for i in df.index]).query("keep == 1").drop('keep',axis=1)