按列值过滤数据框的行

17

我有一个数据框 df

       Num1   Num2 
one       1      0
two       3      2
three     5      4
four      7      6
five      9      8

我想筛选出Num1列中大于3且Num2列中小于8的行。

我尝试过这样:

df = df[df['Num1'] > 3 and df['Num2'] < 8]

但出现了错误。

ValueError:系列的真实值不明确。

所以我使用了

df = df[df['Num1'] > 3]
df = df[df['Num2'] < 8]

我认为代码可以更短。

还有其他办法吗?

2个回答

31

你需要添加 (),因为按位运算符 & 的优先级问题:

df1 = df[(df['Num1'] > 3) & (df['Num2'] < 8)]
print (df1)
       Num1  Num2
three     5     4
four      7     6
更好的解释在这里。here
或者如果需要最短的代码,请使用query
df1 = df.query("Num1 > 3 and Num2 < 8")
print (df1)
       Num1  Num2
three     5     4
four      7     6

df1 = df.query("Num1 > 3 &  Num2 < 8")
print (df1)
       Num1  Num2
three     5     4
four      7     6

1
如果我们要减少字符,我们也可以像 df.Num 这样处理列名(假设名称是有效的 Python 变量名称,例如字母数字,以字母开头,允许下划线)! - ptim
之前不知道有df.query这个函数!谢谢! - Monica Heddneck
1
请注意,如果列名包含任何特殊字符,则 df.query 似乎无法正常工作。据我所知,它不适用于使用 dash-case 样式的列名。 - Diego

9

是的,您可以使用&运算符:

df = df[<b>(</b>df['Num1'] > 3<b>) & (</b>df['Num2'] < 8<b>)</b>]
#                        ^ & operator

这是因为and运算符基于两个操作数的真值进行计算,而&运算符可以在任意数据结构上定义。
这里必须使用括号,因为&的优先级比><低,所以如果没有括号,Python会将表达式解析为df['Num1'] > (3 & df['Num2']) < 8
注意,你可以使用|运算符作为逻辑或。

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