数据框按列值过滤行
Posted
技术标签:
【中文标题】数据框按列值过滤行【英文标题】:Dataframe filtering rows by column values 【发布时间】:2017-11-12 21:44:52 【问题描述】:我有一个数据框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: Series 的真值不明确。
所以我用了
df = df[df['Num1'] > 3]
df = df[df['Num2'] < 8]
我认为代码可以更短。
还有其他方法吗?
【问题讨论】:
【参考方案1】:是的,您可以使用&
运算符:
df = df[(df['Num1'] > 3) & (df['Num2'] < 8)]
# ^ & operator
这是因为and
作用于两个操作数的真实性值,而&
运算符可以定义在任意数据结构上。
括号在这里是强制性的,因为&
绑定比>
和<
短,所以没有括号,Python 会将表达式读取为df['Num1'] > (3 & df['Num2']) < 8
。
请注意,您可以将|
运算符用作逻辑或。
【讨论】:
【参考方案2】:您需要添加()
,因为运算符优先于按位运算符&
:
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
【讨论】:
如果我们想要更少的字符,我们可以使用像df.Num
这样的列名(假设名称是一个有效的python变量名,例如字母数字,以字母开头,允许下划线) ,也是!
不知道df.query
!谢谢!
请注意,如果列有任何特殊字符,df.query
似乎不起作用。据我所知,它不起作用,例如,dash-case
样式的列。以上是关于数据框按列值过滤行的主要内容,如果未能解决你的问题,请参考以下文章