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






Используйте .str.replace и передайте свои строки как одну строку, разделенную конвейером. Вы можете использовать re.escape(), чтобы экранировать символы регулярного выражения из этой строки, как предлагает @jpp. Я немного подправляю его предложение, избегая повторения:
import re
df2['page'] = df2['page'].str.replace(re.escape('|'.join(bad_chars)), '')
Это не работает в общем случае, например как насчет символов регулярных выражений, таких как |, в вашем списке плохих символов?
Их нужно экранировать с помощью символа ´ \ ´
Так это единственный способ вручную просмотреть список плохих символов один за другим, чтобы проверить, нет ли у них экранирования? Я уверен, что есть способ получше ...
Спасибо, ребята, за разговор, я принимаю ответ jpp, поскольку он делает именно то, что я ищу, в общем виде.
Мы оба улучшили предыдущие ответы друг друга. Я считаю, что моя строка кода показывает лучший способ сделать это.
извинения, я дважды запускал один и тот же код, но когда я запускаю обновленную версию mcard, при отсутствии ошибок данные остаются прежними - возможно, по какой-то причине требуется итерация. (по крайней мере, с моим набором данных)
Один из способов - экранировать символы с помощью 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, у него все отлично
Ура, mcard, когда я это сделаю, я получаю сообщение об ошибке: TypeError: unhashable type: 'list'. Если я заменяю переменную списка буквальным примером элемента в этом списке, она работает. Есть ли способ заменить более одной строки одновременно?