Строки фрейма данных Python содержат несколько списков поиска строк

#python #python-3.x

#python #python-3.x

Вопрос:

У меня есть список элементов в строковом формате, которые я хочу искать в каждой строке и удалять другие.

Приведенный ниже код работает нормально.

Однако он заменяет поиск из последнего элемента списка.

Я пытаюсь получить все результаты из списка ‘l’.

Пожалуйста, смотрите ниже для ввода и ожидаемого результата.

Код:

 l = ['Testing','Goals are met','Mathematics subject','tesTed prototype','Some Test']
df = pd.DataFrame(l)
df.columns = ['l']
  

Входные данные:

     l
0   Testing
1   Goals are met
2   Mathematics subject
3   tesTed prototype
4   Some Test
  

Код для захвата строк содержит:

 select_list = ["Math",'Test']

for s in select_list:
    # keeping into a dataframe
    df1 = df[df.l.str.contains(s,case=False)]

df1
  

Ожидаемый результат: Обратите внимание, что приведенный выше код не выбирал строку ‘Math’ сверху.

 l
0   Testing
2   Mathematics subject
3   tesTed prototype
4   Some Test
  

Ответ №1:

Причина в том, что вы переназначаете на df1 с каждой итерацией for цикла.

Вместо этого вам следует использовать регулярное выражение:

 filtered_df = df[df['l'].str.contains('|'.join(select_list), case=False)]
  

Вывод:

                      l
0              Testing
2  Mathematics subject
3     tesTed prototype
4            Some Test
  

Приведенный выше .join вызов выдает строку 'Math|Test' , которая при передаче в .str.contains сообщает ему искать все строки, содержащие хотя бы одну из 'Math' и 'Test' . Если вы добавите больше строк в select_list , то он также будет искать их.

Обратите внимание, что в определенных случаях (скажем, если строки в select_list содержат специальные символы, такие как «.»), этот подход может потребовать модификации.

Ответ №2:

Пожалуйста, попробуйте это

 select_list = ["Math",'Test']
df1 =  pd.DataFrame([], columns = ['l'])
for s in select_list:
    df1 = pd.merge(df1, df[df.l.str.contains(s,case=False)], how='outer')
  

альтернативный вариант: вместо использования dataframe в loop вы также можете использовать list для захвата результата и создания dataframe

 l2 = []
for s in select_list:
    l2.extend(df[df.l.str.contains(s,case=False)].values.tolist())

df3 = pd.DataFrame(l2)
df3.columns = ['l']