#python #pandas #numpy #filter
Вопрос:
может ли кто-нибудь показать мне сценарий для фильтрации 2 или более вариантов в столбце ?
Например:
A B C D E F G
1 x x x x x AAA
3 x x x x x BBB
4 x x x x x AAA
1 x x x x x CCC
4 x x x x x CCC
5 x x x x x AAA
Я бы хотел отфильтровать «AAA» и «BBB» за один раз. Я пробовал с:
import pandas as pd
import numpy as np
import openpyxl
from numpy.random import choice
df = pd.read_excel('filepath', sheet_name = 'Sheet1')
df_sample = df.loc[df['G'].str.contains("AAA", 'BBB")]
Но он возвращает только столбец G с «AAA», но «BBB» отсутствует.
Пожалуйста, объясните мне, как это сделать.
Большое спасибо!
Ответ №1:
Вы можете использовать contains
с |
разделителем :
df[df.G.str.contains("AAA|BBB")]
Ответ №2:
Вы передаете два параметра функции contains из документации.
Series.str.contains(pat, case=True, flags=0, na=None, regex=True)
Ваша функция эквивалентна
df['G'].str.contains(pat="AAA", case="BBB")
Строка "BBB"
обрабатывается как True
в python, поэтому ваш код эквивалентен-
df['G'].str.contains(pat="AAA", case=True)
Вот почему вы получаете результаты только для "AAA"
того, чтобы получить правильное решение, вы можете следовать решению @Nathan Furnal
df[df.G.str.contains("AAA|BBB")]
Ответ №3:
Вы могли бы использовать isin
или contains
, но помните:
isin
проверяет, содержится ли каждое значение в столбце в списке произвольных значений.isin
работает по столбцам и доступен для всех типов данных.contains
проверяет, содержатся ли произвольные значения в каждом значении столбца.contains
работает по элементам и имеет смысл только при работе со строками (или значениями, которые могут быть представлены в виде строк).
Вот подход, использующий isin
:
choices_to_keep = ["AAA", 'BBB"]
filtered_df = df.G.isin(choices_to_keep)