Как использовать функцию запроса с bool в пандах Python? - PullRequest
0 голосов
/ 14 декабря 2018

Я пытаюсь сделать что-то вроде

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

, но с

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

Как правильно использовать query со столбцом bool?

Ответы [ 3 ]

0 голосов
/ 14 декабря 2018

Еще проще использовать запрос:

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

На самом деле, ниже приведены способы, не связанные с запросом, они на самом деле не такие красивые и могут быть медленнее (так как запрос иногда очень оптимизирован)

Хотя вы действительно должны использовать:

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

или, если хотите, (более читабельно, но не всегда возможно):

df[~df.column].count()
0 голосов
/ 15 декабря 2018

Pandas использует pandas.eval () для оценки кода, который вы передаете в pandas.query () . pandas.eval () делает this :

Оценка выражения Python как строки с использованием различных бэкэндов.

ВPython вам нужно использовать оператор is для сравнения False с чем угодно, просто потому, что если вы сравниваете что-то с False, вы всегда получите False в результате (так работает Python, я не знаю, почему). pandas.query () не поддерживает оператор , но у нас есть обходные пути:

  • Мы можем проверить, если столбец!= столбец .Если это возвращает True, это означает, что мы сравниваем какое-то значение с False.Используйте df.query ("column! = False")

  • Мы можем использовать функции панд, если передадим библиотеку панд в ключевом слове local_dict параметр.Как:

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

Также я не уверен, что вы пытаетесь сделать с count () как count () count non-NA cells for each column or row.

  • Если вы пытаетесь просто посчитать строки, используйте shape .
  • Если вы пытаетесь подсчитать, сколько NA-клетокв каждом столбце, используя только те строки, где column равно False, чем его ОК и должно работать

PS не используйте кавычки вокруг имени столбца в df.query() .

0 голосов
/ 14 декабря 2018

Это просто '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
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...