基于两个条件在Pandas Python中选择数据框的行

11

我有一个数据框,我想运行类似于以下代码:

subsetdf= df.loc[(df['Item_Desc'].str.contains('X')==True) or \
                 (df['Item_Desc'].str.contains('Y')==True ),:]

选择所有包含"X"或"Y"子字符串的Item Desc列的行。

The truth value of a Series is ambiguous. Use a.empty, a.bool(), a.item(), a.any() or a.all(). 

运行时出现了错误。有什么帮助吗?

2个回答

13

使用|代替or。所以:

df.loc[(cond1) | (cond2), :]
or 运算符希望比较两个布尔值(或者两个求值为 True 或 False 的表达式)。但是 Series(或 numpy 数组)并不仅仅求值为 True 或 False,这种情况下我们希望对两个 Series 中的元素逐个进行比较。为此,可以使用称为“按位或”(|)的操作符。

Pandas 遵循 numpy 的惯例。有关详细信息,请参见 pandas 文档中的此处说明。


你能告诉我这个的文档在哪里吗?这是Pandas的东西还是Python的东西?我找不到任何关于“|”的内容。 - wolfsatthedoor
@joris,很好的答案。有没有更一般的方法呢?例如,如果您有一个列名称列表,例如['d1','d2','d3' ...],是否有一种方法指定一个通用条件以应用于所有列,并在任何匹配时包括行。在我的情况下,cols d1等要么是1要么是0,并且只想要具有其中一个cols d1等中的1的行。还有其他列,具有其他数据,例如文本,我不考虑此选择。 - Peter Coghill
不是通用解决方案,但在这种情况下,您可以执行类似于 (df[cols] == 1).any(axis=1) 的操作作为条件。 - joris

3
条件应该如下:
df.loc[(cond1) | (cond2)]

每个条件都必须用括号括起来。 括号优先级高于位运算符“OR”。 如果没有提供括号,也会出现相同的错误。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接