如何在python熊猫中使用带有bool的查询功能?

时间:2018-12-14 20:21:21

标签: python pandas dataframe

我正在尝试做

df.query("'column' == 'a'").count()

df.query("'column' == False").count()

query与布尔列一起使用的正确方法是什么?

3 个答案:

答案 0 :(得分:1)

就是'column == False'

>>> df = pd.DataFrame([[False, 1], [True, 2], [False, 3]], columns=['column', 'another_column'])                       
>>> df                                                                                                                 
   column  another_column
0   False               1
1    True               2
2   False               3
>>> df.query('column == False')                                                                                        
   column  another_column
0   False               1
2   False               3
>>> df.query('column == False').count()                                                                                
column            2
another_column    2
dtype: int64

我个人更喜欢布尔索引(如果适用于您的情况)。

>>> df[~df['column']]                                                                                                  
   column  another_column
0   False               1
2   False               3
>>> df[~df['column']].count()                                                                                          
column            2
another_column    2
dtype: int64

答案 1 :(得分:0)

使用查询更简单:

df.query("~column").count()

实际上,以下是非查询方法,它们实际上不那么漂亮,而且速度可能较慢(因为查询有时会非常优化)

尽管您确实应该使用:

df[~df["column"]].count()

或者,如果您愿意(可读性更好,但并不总是可能):

df[~df.column].count()

答案 2 :(得分:0)

Pandas使用 pandas.eval()评估传递给 pandas.query()的代码。 pandas.eval()使this

  

使用各种后端将Python表达式评估为字符串。

在Python中,您需要使用 is 运算符将False与任何事物进行比较,这仅仅是因为,如果将某些事物与False进行比较,您总是会得到False作为结果(这就是Python的工作原理,我并不是真的知道为什么)。 pandas.query()似乎不支持 is 语句,但是我们有解决方法:

  • 我们可以检查列!=列。如果返回True,则表示我们正在将某些值与False进行比较。 使用 df.query(“ column!= False”)

  • 如果在 local_dict 关键字参数中传递了pandas库,则可以使用pandas函数。喜欢:

    import pandas as pd
    local_vars = {'pd': pd}
    df.query(expr="@pd.isna(column)",local_dict=local_vars)
    

我也不确定您要使用 count()做什么,因为 count()non-NA cells for each column or row

  • 如果您只想计算行数,请使用 shape
  • 如果您要计算每列中有多少个NA单元格,请仅使用等于False的行,这样就可以,并且可以使用

P.S不要在 df.query()中的列名周围使用引号。