#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']