数据帧按列值过滤行

时间:2017-06-11 09:01:58

标签: python pandas dataframe filter

我有一个数据框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 个答案:

答案 0 :(得分:13)

您需要添加(),因为运算符优先级与逐位运算符&

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 :(得分:4)

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

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

这是因为and适用于两个操作数的真值,而&运算符可以在任意数据结构上定义。

这里的括号是必需的,因为&的绑定时间比><短,因此如果没有括号,Python会将表达式读为df['Num1'] > (3 & df['Num2']) < 8

请注意,您可以将|运算符用作逻辑运算符或。