Как заменить подстроки в строках в фрейме данных pandas

У меня есть фрейм данных и список строк, которые я хочу удалить из столбца в этом фрейме данных. Но когда я использую функцию замены, эти символы остаются. Может кто-нибудь объяснить, почему это так?

bad_chars = ['?', '!', ',', ';', "'", '|', '-', '--', '(', ')', 
             '[', ']', '{', '}', ':', '&', '\n']

и заменить:

df2['page'] = df2['page'].replace(bad_chars, '')

когда я распечатываю df2:

for index, row in df2.iterrows():
    print( row['project'] + '\t' + '(' + row['page'] + ',' + str(row['viewCount']) + ')' + '\n'  )

ru (The_Voice_ (U.S._season_14), 613)

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
3
0
1 003
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Используйте .str.replace и передайте свои строки как одну строку, разделенную конвейером. Вы можете использовать re.escape(), чтобы экранировать символы регулярного выражения из этой строки, как предлагает @jpp. Я немного подправляю его предложение, избегая повторения:

import re 
df2['page'] = df2['page'].str.replace(re.escape('|'.join(bad_chars)), '')

Ура, mcard, когда я это сделаю, я получаю сообщение об ошибке: TypeError: unhashable type: 'list'. Если я заменяю переменную списка буквальным примером элемента в этом списке, она работает. Есть ли способ заменить более одной строки одновременно?

Rob 14.04.2018 19:26

Это не работает в общем случае, например как насчет символов регулярных выражений, таких как |, в вашем списке плохих символов?

jpp 14.04.2018 19:32

Их нужно экранировать с помощью символа ´ \ ´

mcard 14.04.2018 19:34

Так это единственный способ вручную просмотреть список плохих символов один за другим, чтобы проверить, нет ли у них экранирования? Я уверен, что есть способ получше ...

jpp 14.04.2018 19:35

Спасибо, ребята, за разговор, я принимаю ответ jpp, поскольку он делает именно то, что я ищу, в общем виде.

Rob 14.04.2018 19:42

Мы оба улучшили предыдущие ответы друг друга. Я считаю, что моя строка кода показывает лучший способ сделать это.

mcard 14.04.2018 19:45

извинения, я дважды запускал один и тот же код, но когда я запускаю обновленную версию mcard, при отсутствии ошибок данные остаются прежними - возможно, по какой-то причине требуется итерация. (по крайней мере, с моим набором данных)

Rob 14.04.2018 19:49
Ответ принят как подходящий

Один из способов - экранировать символы с помощью re, а затем использовать pd.Series.str.replace.

import pandas as pd
import re

bad_chars = ['?', '!', ',', ';', "'", '|', '-', '--', '(', ')', 
             '[', ']', '{', '}', ':', '&', '\n']

df = pd.DataFrame({'page': ['hello?', 'problems|here', 'nothingwronghere', 'nobrackets[]']})

df['page'] = df['page'].str.replace('|'.join([re.escape(s) for s in bad_chars]), '')

print(df)

#                page
# 0             hello
# 1      problemshere
# 2  nothingwronghere
# 3        nobrackets

Спасибо большое, jpp, у него все отлично

Rob 14.04.2018 19:41

Другие вопросы по теме