Python 如何在pandas中实现具有多个列的布尔搜索

Python 如何在pandas中实现具有多个列的布尔搜索,python,pandas,Python,Pandas,我有一份工作,我想用SQL术语完成以下工作: SELECT * FROM df WHERE column1 = 'a' OR column2 = 'b' OR column3 = 'c' etc. 现在,对于一个列/值对,这就起作用了: foo = df.loc[df['column']==value] 但是,我不知道如何将其扩展到多个列/值对 要清楚,每一列都匹配不同的值。 由于运算符优先级,您需要将多个条件括在大括号中,并使用按位and和or运算符: foo = df[(df['colu

我有一份工作,我想用SQL术语完成以下工作:

SELECT * FROM df WHERE column1 = 'a' OR column2 = 'b' OR column3 = 'c' etc.
现在,对于一个列/值对,这就起作用了:

foo = df.loc[df['column']==value]
但是,我不知道如何将其扩展到多个列/值对

要清楚,每一列都匹配不同的值。
由于运算符优先级,您需要将多个条件括在大括号中,并使用按位and和or运算符:

foo = df[(df['column1']==value) | (df['columns2'] == 'b') | (df['column3'] == 'c')]
如果你使用and或or,那么熊猫很可能会抱怨这个比较模棱两可。在这种情况下,不清楚我们是否在比较条件系列中的每个值,以及如果只有1或除1之外的所有值与条件匹配,这意味着什么。这就是为什么应该使用位运算符或numpy np.all或np.any来指定匹配条件

还有查询方法:


但主要在列名和索引值之间可能存在歧义的问题上存在一些限制。

更简洁但不一定更快的方法是使用DataFrame.isin和DataFrame.any

最简单的方法 如果这有帮助,点击向上箭头!塔恩克斯!! 学生=['jack1','Apples1',341, “Riti1”,“Mangos1”,311, “Aadi1”、“图形1”、301、, “Sonia1”,“苹果1”,321, “Lucy1”,“Mangos1”,331, “Mike1”、“苹果1”、351、, “Mik”、“苹果1”、np.nan ] 创建数据帧对象 df=pd.DataFramestudents,列=['Name1','Product1','Sale1'] printdf 名称1产品1销售1 0 jack1应用程序1 341 1.1.1.311 2 Aadi1图1 301 3件Sonia1苹果1 321 4 Lucy1 Mangos1331 5 Mike1应用程序1 351 6 Mik苹果1 NaN 选择上面数据框中“Product”列包含值“Apple”的行, 子集=df[df['Product1']=='Apples1'] 打印子集 名称1产品1销售1 0 jack1应用程序1 341 3件Sonia1苹果1 321 5 Mike1应用程序1 351 6 Mik苹果1 NA 在上面的数据框中选择“Product”列包含值“Apple”的行,并在Sale中选择notnull值 subsetx=df[df['Product1']==Apples1&df['Sale1'].notnull] printsubsetx 名称1产品1销售1 0 jack1应用程序1 341 3件Sonia1苹果1 321 5 Mike1应用程序1 351 选择上面数据框中“Product”列包含值“Apple”的行,Sale=351 subsetx=df[df['Product1']==Apples1&df['Sale1']==351] printsubsetx 名称1产品1销售1 5 Mike1应用程序1 351 另一个例子 subsetData=df[df['Product1'].isin['Mangos1','Grapes1']] 打印子数据 名称1产品1销售1 1.1.1.311 2 Aadi1图1 301 4 Lucy1 Mangos1331
这是我找到的原始链接。我稍微编辑了一下-

2014年提出的所有考虑因素仍然有效,但是pandas.Dataframe.ix方法在pandas的0.0.20版本中被弃用。直接从:

警告:从0.20.0开始,.ix索引器已被弃用,取而代之 更严格的.iloc和.loc索引器

在pandas的后续版本中,此方法已被新方法和替换

如果您想了解更多信息,可以在文章中找到上述方法之间的比较

最终,从这个角度来看,到目前为止,即将出版的熊猫版本似乎没有任何变化,对此问题的答案如下:

foo = df.loc[(df['column1']==value) | (df['columns2'] == 'b') | (df['column3'] == 'c')]
这种方法可以非常直观地做到这一点。用要计算的字符串表示条件,如以下示例所示:

df = df.query("columnNameA <= @x or columnNameB == @y")

x和y是声明的变量,可以用@

或df[df.column1>0.5&df.column2>1.2]引用
df = df.query("columnNameA <= @x or columnNameB == @y")