https://pandas.pydata.org/pandas-docs/stable/indexing.html#the-query-method

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

Я бы хотел, чтобы мои пользователи могли указывать запрос в файле конфигурации. Синтаксис кажется достаточно интуитивно понятным, поэтому я могу ожидать, что мои пользователи, не являющиеся программистами (но инженеры), поймут это.

Не хватает только одной вещи: способ выделить все в кадре данных. Иногда мои пользователи хотят использовать каждую строку, чтобы они добавили «All» или что-то еще в этот параметр конфигурации. Фактически это будет вариант по умолчанию.

Я попытался df.query ('True'), но это вызвало KeyError. Я попытался df.query ('1'), но это вернуло строку с индексом 1. Пустая строка вызвала ValueError.

Единственное, о чем я могу думать, это: 1) ставить условие if каждый раз, когда мне нужно выполнить запрос такого типа (вероятно, 3 или 4 раза в коде), или 2) подкласс DataFrame и либо переопределить запрос, либо добавить метод query_with_all:

import pandas as pd

class MyDataFrame(pd.DataFrame):
    def query_with_all(self, query_string):
        if query_string.lower() == 'all':
            return self
        else:
            return self.query(query_string)

А потом каждый раз используй свой собственный класс вместо одного панды. Это единственный способ сделать это?

 moink22 июн. 2018 г., 14:02
@Thomas, я закончил тем, что реализовал свой собственный модуль с чем-то очень похожим на код, который я показал, хотя я не заканчивал тем, что использовал наследование, и несколько других функций в запросах
 Zero19 окт. 2017 г., 05:42
Или иметь глобальныйall_true = [True]*len(df) а затем отослать этоdf.query('@all_true ') возможно? Или, иметь полностью True зарезервированный столбец, если это не ограничение и ссылатьсяdf.query('_all_true_col')?
 moink19 окт. 2017 г., 05:48
Ноль, что касается вашего второго предложения, мне нужно было бы использовать один и тот же запрос на разных фреймах данных разной длины, не зная заранее длины.
 Zero19 окт. 2017 г., 05:38
Если пользователи знают имена столбцов заранее, он мог быdf.query('a == a') гдеa является одним из столбцов, но не кажется чистым. Ах, может не работать для строк сnull
 moink19 окт. 2017 г., 05:43
Ноль, столбцы изменятся, но есть один столбец, который обязательно должен быть там, а не быть нулевым, так что я буду иметь это в виду в качестве опции. Я не думаю, что заставил бы моих пользователей поместить это в файл конфигурации, а вместо этого вместо «все» использовал бы это для внутреннего использования. Но все же не так чисто, как хотелось бы, как вы упоминаете ..

Ответы на вопрос(2)

df.query('ilevel_0 in ilevel_0') всегда будет возвращать полный фрейм данных, даже если индекс содержитNaN значения или даже когда датафрейм полностью пуст.

В вашем конкретном случае вы можете определить глобальную переменнуюall_true = 'ilevel_0 in ilevel_0' (как предлагается в комментарияхНуль) чтобы ваши инженеры могли использовать вместо этого имя глобальной переменной в своем конфигурационном файле.

Это утверждение - просто грязный способ правильно запроситьTrue как ты уже пробовал.ilevel_0 это более формальный способ убедиться, что вы ссылаетесь на индекс. Смотрите документацию здесь для более подробной информации об использованииin а такжеilevel_0: https://pandas.pydata.org/pandas-docs/stable/indexing.html#the-query-method

Решение Вопроса

def query_with_all(data_frame, query_string):
    if query_string == "all":
        return data_frame
    return data_frame.query(query_string)

Всякий раз, когда вам нужно использовать этот тип запроса, просто вызовите функцию с фреймом данных и строкой запроса. Там нет необходимости использовать какие-либо дополнительныеif заявления или подклассpd.Dataframe.

Если вы ограничены в использованииdf.queryВы можете использовать глобальную переменную

ALL = slice(None)
df.query('@ALL', engine='python')

Если вам не разрешено использовать глобальные переменные, и если ваш DataFrame не MultiIndexed, вы можете использовать

df.query('tuple()')

Все это будет свойство обрабатыватьNaN ценности.

 coldspeed20 дек. 2018 г., 19:59
Те же версии, без разницы. Я думаю, что это будет работать, если вы добавите engine = 'python' в качестве аргумента. Ваш второй вариант не будет работать на мультииндексированных фреймах данных.
 Joshua20 дек. 2018 г., 17:45
Какие версии работают? У меня pd .__ version__ = '0.23.4', np .__ version__ = '1.15.4', sys.version = '3.7.1 (по умолчанию, 23 октября 2018, 14:07:42) \ n [Clang 4.0.1 (теги / RELEASE_401 / финал)].
 coldspeed20 дек. 2018 г., 07:53
Хм, я пробовал оба, и оба выкидывают ошибки. Вы использовали какие-либо варианты сquery? Первый дает «ValueError: неизвестный тип объекта», а второй «TypeError: неподдерживаемый тип выражения: <class 'tuple'>". Любая идея?
 Joshua20 дек. 2018 г., 07:51
@coldspeed Извините, что не прочитал ваш пост / комментарии полностью. Я добавил два решения, которые остаются (в основном) внутри запроса.
 coldspeed20 дек. 2018 г., 06:54
Что ж, это очевидный выбор (а также в ОП), но идея состоит в том, чтобы сохранить этот внутренний запрос, если это вообще возможно?

Ваш ответ на вопрос