Большинство операций в pandas
может быть выполнены с помощью оператора цепочки ( groupby
, aggregate
, apply
, и т.д.), но единственным способом я нашел для фильтра строк с помощью обычной индексации кронштейна
df_filtered = df[df['column'] == value]
Это непривлекательно, так как требует, чтобы я присвоил df
переменную, прежде чем смогу фильтровать ее значения. Есть ли что-то похожее на следующее?
df_filtered = df.mask(lambda x: x['column'] == value)
df.query
и,pd.eval
кажется, хорошо подходит для этого варианта использования. Для получения информации оpd.eval()
семействе функций, их функциях и сценариях использования, пожалуйста, посетите Dynamic Expression Evaluation в pandas, используя pd.eval () .Ответы:
Я не совсем уверен, что вы хотите, и ваша последняя строка кода тоже не помогает, но в любом случае:
«Цепная» фильтрация выполняется путем «цепочки» критериев в логическом индексе.
Если вы хотите объединить методы, вы можете добавить свой собственный метод маски и использовать его.
источник
(df.A == 1) & (df.D == 6)
, является ли "&" перегруженным оператором в Pandas?pandas.
. Вы должныimport pandas as pd
.import pandas as pd
это обычная практика сейчас. Я сомневаюсь, что это было, когда я ответил на вопрос.Фильтры могут быть связаны с помощью запроса Pandas :
Фильтры также могут быть объединены в один запрос:
источник
df.query('a in list([1,2])')
,s = set([1,2]); df.query('a in @s')
.Ответ от @lodagro великолепен. Я бы расширил его, обобщив функцию маски как:
Тогда вы можете делать такие вещи, как:
источник
DataFrame
s уже!С версии 0.18.1
.loc
метод принимает вызываемый для выбора. Вместе с лямбда-функциями вы можете создавать очень гибкие цепные фильтры:Если все, что вы делаете, это фильтрация, вы также можете опустить
.loc
.источник
Я предлагаю это для дополнительных примеров. Это тот же ответ, что и https://stackoverflow.com/a/28159296/
Я добавлю другие правки, чтобы сделать этот пост более полезным.
pandas.DataFrame.query
query
был сделан именно для этой цели. Рассмотрим кадр данныхdf
Давайте использовать
query
для фильтрации всех строк, гдеD > B
Который мы цепи
источник
У меня был тот же вопрос, за исключением того, что я хотел объединить критерии в условие ИЛИ. Формат, заданный Wouter Overmeire, объединяет критерии в условие AND, так что оба должны быть выполнены:
Но я обнаружил, что если вы оберните каждое условие
(... == True)
и соедините критерии с каналом, критерии объединятся в условие ИЛИ, удовлетворяемое всякий раз, когда любое из них истинно:источник
df[(df.A==1) | (df.D==6)]
бы достаточно для того, что вы пытаетесь достичь?Pandas предлагает две альтернативы ответу Wouter Overmeire, которые не требуют переопределения. Один
.loc[.]
с вызываемым, как вдругой
.pipe()
, как висточник
Мой ответ похож на другие. Если вы не хотите создавать новую функцию, вы можете использовать то, что pandas уже определил для вас. Используйте метод трубы.
источник
a.join(b).pipe(lambda df: df[df.column_to_filter == 'VALUE'])
Если вы хотите применить все обычные логические маски, а также маску общего назначения, вы можете поместить в файл следующее и затем просто назначить их все следующим образом:
Использование:
Это немного странно, но может сделать вещи немного чище, если вы постоянно отбираете и меняете наборы данных в соответствии с фильтрами. Есть также фильтр общего назначения, адаптированный из Даниэля Велкова выше в функции gen_mask, который вы можете использовать с лямбда-функциями или иным образом, если хотите.
Файл для сохранения (я использую masks.py):
источник
Это решение более хакерское с точки зрения реализации, но я считаю, что оно намного чище с точки зрения использования, и оно, безусловно, более общее, чем другие предложенные.
https://github.com/toobaz/generic_utils/blob/master/generic_utils/pandas/where.py
Вам не нужно загружать весь репозиторий: сохраните файл и сделайте
должно хватить. Тогда вы используете это так:
Немного менее глупый пример использования:
Кстати, даже в случае, когда вы просто используете логические столбцы,
может быть гораздо более эффективным, чем
потому что он оценивает
cond2
только гдеcond1
естьTrue
.ОТКАЗ ОТ ОТВЕТСТВЕННОСТИ: Я сначала дал этот ответ в другом месте, потому что я не видел этого.
источник
Просто хочу добавить демонстрацию, используя
loc
фильтр не только по строкам, но и по столбцам, а также некоторые преимущества цепной операции.Код ниже может фильтровать строки по значению.
Немного изменив его, вы также можете фильтровать столбцы.
Итак, почему мы хотим цепной метод? Ответ в том, что читать легко, если у вас много операций. Например,
источник
Кажется, работает: вы также можете вложить
[]
оператор. Может быть, они добавили его, так как вы задали вопрос.источник
df
теперь не обязательно ссылается на вывод предыдущей части цепочки.Если вы настроите свои столбцы для поиска в качестве индексов, то вы можете использовать
DataFrame.xs()
для получения поперечного сечения. Это не так универсально, какquery
ответы, но может быть полезно в некоторых ситуациях.источник
Вы также можете использовать библиотеку NumPy для логических операций. Это довольно быстро.
источник