Отфильтруйте 2 варианта в столбце

#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)