数据帧按列值过滤行

Seu*_*hoi 7 python filter dataframe pandas

我有一个Dataframe df

       Num1   Num2 
one       1      0
two       3      2
three     5      4
four      7      6
five      9      8
Run Code Online (Sandbox Code Playgroud)

我想过滤Num1中值大于3且Num2中小于8的行.

我试过这个

df = df[df['Num1'] > 3 and df['Num2'] < 8]
Run Code Online (Sandbox Code Playgroud)

但是发生了错误.

ValueError:Series的真值是不明确的.

所以我用过

df = df[df['Num1'] > 3]
df = df[df['Num2'] < 8]
Run Code Online (Sandbox Code Playgroud)

我认为代码可以更短.

还有其他方法吗?

jez*_*ael 14

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

df1 = df[(df['Num1'] > 3) & (df['Num2'] < 8)]
print (df1)
       Num1  Num2
three     5     4
four      7     6
Run Code Online (Sandbox Code Playgroud)

这里有更好的解释.

或者如果需要最短的代码使用query:

df1 = df.query("Num1 > 3 and Num2 < 8")
print (df1)
       Num1  Num2
three     5     4
four      7     6
Run Code Online (Sandbox Code Playgroud)
df1 = df.query("Num1 > 3 &  Num2 < 8")
print (df1)
       Num1  Num2
three     5     4
four      7     6
Run Code Online (Sandbox Code Playgroud)


Wil*_*sem 5

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

df = df[(df['Num1'] > 3) & (df['Num2'] < 8)]
#                        ^ & operator
Run Code Online (Sandbox Code Playgroud)

这是因为and可以对两个操作数的真实性值进行运算,而&可以在任意数据结构上定义运算符。

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

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