数据框按列值过滤行

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】:

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

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

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

括号在这里是强制性的,因为&amp; 绑定比&gt;&lt; 短,所以没有括号,Python 会将表达式读取为df['Num1'] &gt; (3 &amp; df['Num2']) &lt; 8

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

【讨论】:

【参考方案2】:

您需要添加(),因为运算符优先于按位运算符&amp;

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 样式的列。

以上是关于数据框按列值过滤行的主要内容,如果未能解决你的问题,请参考以下文章

按列值的前导字符对数据行进行分组

按列值分组的列值更新mysql排名

如何在 Pandas 数据框中按列值分组

按列值将数据框拆分为两个[重复]

Spark partitionBy |按列值而不是 columnName=value 保存

按列值的差异对 SQL 中的数据进行分组