Как я могу достичь эквивалентов SQL IN
и NOT IN
?
У меня есть список с необходимыми значениями. Вот сценарий:
df = pd.DataFrame({'countries':['US','UK','Germany','China']})
countries = ['UK','China']
# pseudo-code:
df[df['countries'] not in countries]
Мой текущий способ сделать это заключается в следующем:
df = pd.DataFrame({'countries':['US','UK','Germany','China']})
countries = pd.DataFrame({'countries':['UK','China'], 'matched':True})
# IN
df.merge(countries,how='inner',on='countries')
# NOT IN
not_in = df.merge(countries,how='left',on='countries')
not_in = not_in[pd.isnull(not_in['matched'])]
Но это похоже на ужасный клудж. Кто-нибудь может улучшить это?
python
pandas
dataframe
sql-function
LondonRob
источник
источник
Ответы:
Вы можете использовать
pd.Series.isin
.Для "IN" используйте:
something.isin(somewhere)
Или для «НЕ В»:
~something.isin(somewhere)
В качестве рабочего примера:
источник
isin
был добавлен в .13.df = pd.Series({'countries':['US','UK','Germany','China']})
df
, и мой, и его, этоDataFrame
.countries
это список.df[~df.countries.isin(countries)]
производит aDataFrame
, а не aSeries
и, кажется, работает даже в 0.11.0.dev-14a04dd.countries
переменную. Что ж, ОП делает это, и это наследуется, но то, что раньше что-то делалось плохо, не оправдывает того, чтобы делать это плохо сейчас.Альтернативное решение, использующее метод .query () :
источник
query
больше не экспериментальный.Pandas предлагает два метода:
Series.isin
иDataFrame.isin
для Series и DataFrames, соответственно.Фильтр DataFrame на основе одного столбца (также относится к серии)
Наиболее распространенный сценарий - применение
isin
условия к определенному столбцу для фильтрации строк в DataFrame.Series.isin
принимает различные типы в качестве входных данных. Ниже приведены все действительные способы получить то, что вы хотите:Фильтр по МНОГИМ столбцам
Иногда вы захотите применить проверку членства «in» с некоторыми поисковыми терминами в нескольких столбцах,
Чтобы применить
isin
условие к обоим столбцам «A» и «B», используйтеDataFrame.isin
:Исходя из этого, чтобы сохранить строки, где находится хотя бы один столбец
True
, мы можем использоватьany
вдоль первой оси:Обратите внимание, что если вы хотите искать каждый столбец, вы просто пропустите шаг выбора столбца и выполните
Аналогично, чтобы сохранить строки, в которых находятся ВСЕ столбцы
True
, используйтеall
тот же способ, что и раньше.Примечательным Упоминания:
numpy.isin
,query
, списочные (строка данных)В дополнение к методам , описанным выше, вы можете также использовать Numpy эквивалент:
numpy.isin
.Почему стоит задуматься? Функции NumPy обычно немного быстрее, чем их эквиваленты в pandas, из-за меньших накладных расходов. Так как это поэлементная операция, которая не зависит от выравнивания индекса, очень мало ситуаций, когда этот метод не является подходящей заменой для pandas '
isin
.Процедуры Pandas обычно итеративны при работе со строками, потому что строковые операции трудно векторизовать. Существует много свидетельств того, что составление списков здесь будет быстрее. , Мы прибегаем к
in
проверке сейчас.Однако указывать его намного сложнее, поэтому не используйте его, если не знаете, что делаете.
Наконец, есть также то,
DataFrame.query
что было рассмотрено в этом ответе . Numxpr FTW!источник
Я обычно делаю общую фильтрацию по строкам следующим образом:
источник
Я хотел отфильтровать строки dfbc, которые имели BUSINESS_ID, который также был в BUSINESS_ID dfProfilesBusIds
источник
Собирая возможные решения из ответов:
Для IN:
df[df['A'].isin([3, 6])]
Для НЕ В:
df[-df["A"].isin([3, 6])]
df[~df["A"].isin([3, 6])]
df[df["A"].isin([3, 6]) == False]
df[np.logical_not(df["A"].isin([3, 6]))]
источник
logical_not
- это полный эквивалент~
оператора.внедрить в :
осуществлять не так, как в остальных странах:
источник