Несколько замен регулярных выражений в цикле с пандами - PullRequest
0 голосов
/ 21 июня 2019

Я относительно новичок в регулярных выражениях и пытаюсь заменить часть строки внутри столбца строки в Pandas DataFrame.Проблема в том, что у меня есть несколько типов строк, которые я хочу удалить из своего столбца, сохраняя при этом оставшуюся часть строки.

У меня есть код, работающий с 1 типом строки, но когда я пытаюсь использовать цикл, код не работает.Я не уверен, как указать итератор внутри выражения регулярного выражения.

Вот код, который работает применительно к 1 типу подстроки:

df = pd.DataFrame({'A': ['ba ca t', 'foo', 'bait'],'B': ['abc', 'bar', 'xyz']})
df
df=df.replace({'A': r'^ba ca'}, {'A': ''}, regex=True)
df

Вот код, который не работает, когда я пытаюсь нас использовать. Для цикла:

df = pd.DataFrame({'A': ['ba ca t', 'foo', 'bait'],'B': ['abc', 'bar', 'xyz']})
replace_list=['ba ca','foo']
for i in replace_list:
    df=df.replace({'A': r'^(i)'}, {'A': ''}, regex=True)
df

Я хотел бы перебрать список строк, чтобы удалить их из столбца в DataFrame.

Ответы [ 2 ]

3 голосов
/ 21 июня 2019

'^(i)' не является правильным методом выполнения интерполяции строк.Вы ищете что-то вроде форматирования f-строки (rf'^{i}') или str.format (r'^{}'.format(i)).

Хотя лучшим решением здесь было бы обрыв цикла, поскольку replace позволяет выполнять несколько замен одновременно.

df.replace({'A': replace_list}, '', regex=True)

      A    B
0     t  abc
1        bar
2  bait  xyz

Или, с str.replace:

df['A'].str.replace('|'.join(replace_list), '')

0       t
1        
2    bait
Name: A, dtype: object

Этот пост также стоит прочитать: В чем разница между Series.replace и Series.str.replace

2 голосов
/ 21 июня 2019

Поскольку вы не хотите i изменять шаблон регулярных выражений, вам следует учесть это изменение:

 df=df.replace({'A': r'^({})'.format(i)}, {'A': ''}, regex=True)

Вывод

+----+-------+-----+
|    |  A    |  B  |
+----+-------+-----+
| 0  | t     | abc |
| 1  |       | bar |
| 2  | bait  | xyz |
+----+-------+-----+
...