查找同时满足两个条件的行
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)
假设我有一个数据框:
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)