我有一个数据框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]
我认为代码可以更短。
还有其他办法吗?
答案 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
。
请注意,您可以将|
运算符用作逻辑运算符或。