Удаление пробелов и знаков препинания (кроме круглых скобок) из начала и конца одного столбца в Python

#python-3.x #pandas #str-replace

#python-3.x #pandas #str-заменить

Вопрос:

Учитывая небольшой набор данных следующим образом:

 df = pd.DataFrame({'text':[' a..b?!??', '%hghamp;12','abc123(bj)!!!', '$$$1234(gz)']})
df
  

Out:

             text
0       a..b?!??
1        %hghamp;12
2  abc123(bj)!!!
3    $$$1234(gz)
  

Мне нужно удалить пробелы, знаки препинания с левой и правой сторон text столбца, кроме английских и китайских круглых скобок.

Ожидаемый результат:

             text
0           a..b
1         hghamp;12
2     abc123(bj)
3       1234(gz)
  

Как я мог это сделать в Python?

Мой код:

 df['text'] = df['text'].str.replace('[^ws]','')
  

Out:

 0          ab
1       hgh12
2    abc123bj
3      1234gz
Name: text, dtype: object
  

Спасибо.

Ответ №1:

Я думаю, вам нужно Series.str.strip со всеми значениями из string.punctuation без круглых скобок, а также добавляется :

 df['text'] = df['text'].str.strip('!"#$%amp;* ,-./:;<=>?@[]^_`{|}~ '   "'")
print (df)
         text
0        a..b
1      hghamp;12
2  abc123(bj)
3    1234(gz)
  

Динамическое решение должно быть:

 import string
rem = ['(',')']
add = [' ']
a = set(list(string.punctuation)   add) - set(rem)
    
df['text'] = df['text'].str.strip(''.join(a))
  

Комментарии:

1. Спасибо, нужно ли перечислять все возможные знаки препинания?

2. @ahbon — существует проблема, требующая удаления () и добавления ' ' , поэтому это является причиной для настройки punctuation , добавлено "" ' значение для выбора, оно используется для начала и конца строки для первой длинной строки

3. Адаптируется ли ваше динамическое решение к китайским знакам препинания?

4. @ahbon — Я надеюсь, что так, добавьте значения для добавления и удаления в списки add и rem . Я думаю, что китайские значения отсутствуют string.punctuation , поэтому, если нужно удалить их, добавьте значения в список add

Ответ №2:

Используйте функцию «strip». Небольшой пример ниже

 df['text'] = df['text'].apply(lambda x: x.strip())
  

Комментарии:

1. да, я не внимательно прочитал вопрос — ваш ответ все равно решает его, так что все хорошо