заменить специальный символ python - PullRequest
0 голосов
/ 20 июня 2020

У меня есть список заголовков из файла csv, но у некоторых из них есть (, a), и я хочу удалить его, чтобы он стал (a), а затем добавлю новый заголовок в новый список, но я получил ошибку.

КОД:

import pandas as pd 
import string

new_title  =[]
alphabests = list(string.ascii_letters) # this list invlude all alphabets
title_file = pd.read_csv('D:\\titles.csv',sep=';')
title      = title_file['title']

x=0 #move in titles
while x < len(title):
    y=0 #move in alphabets
    while y < len(alphabests):
        check_about_alpabets = [w.replace(',{}'.format(alphabests[y]), '{}'.format(alphabests[y])) for w in title[x]]
        y +=1
    new_title.append(title[x])
    x +=1

ОШИБКА

TypeError: 'float' object is not iterable

Ответы [ 3 ]

0 голосов
/ 20 июня 2020

В опубликованный код можно внести два улучшения:

  • Использовать dataframe apply вместо использования Python для или пока l oop для обработки каждого заголовка (т.е. очень медленно)
  • Используйте регулярное выражение, а не перебирайте каждую букву алфавита, чтобы проверить наличие запятой, за которой следует буква (также медленно)

Код

import re
def clean_title(title): 
  " Expression to clean title "
  # Remove comma when followed by a word letter 
  return re.sub(r',(\w)', lambda m: m.group(1), title)
    
# Clean titles
df['title'] = df['title'].apply(clean_title)

Тест

  • Создание набора данных - Список названий Mov ie и год выпуска
  • Содержит желаемые и нежелательные запятые в заголовке

Пример нежелательной запятой:

  • S, даже самурай

Пример желаемой запятой:

  • 'I, Tonya'

Создать набор данных

df = pd.DataFrame({'title':['Lock, Stock and Two Smoking Barrels', 'The S,even Samurai', 'B,onnie and C,lyde', 'Reser,voir Dogs', 'A,irplane!', 'Doct,or Zhiva,go', 'I, Tonya'], 
                    'Year':['1998', '1954', '1967', '1992', '1980', '1965', '2017']})
  
print(df)

Набор данных перед очисткой

                                title  Year
0  Lock, Stock and Two Smoking Barrels  1998
1                   The S,even Samurai  1954
2                   B,onnie and C,lyde  1967
3                      Reser,voir Dogs  1992
4                           A,irplane!  1980
5                     Doct,or Zhiva,go  1965
6                             I, Tonya  2017

Набор данных после очистки

                               title  Year
0  Lock, Stock and Two Smoking Barrels  1998
1                    The Seven Samurai  1954
2                     Bonnie and Clyde  1967
3                       Reservoir Dogs  1992
4                            Airplane!  1980
5                       Doctor Zhivago  1965
6                             I, Tonya  2017
0 голосов
/ 20 июня 2020

Вы получаете эту ошибку, потому что переменная 'title' является объектом серии в Pandas, а не списком. Если вы хотите изменить имена столбцов в фрейме данных, вы можете сделать это:

      column_name = list(title_file.columns)
      column_dict = {}
      for name in column_name:
          for char,idx in enumerate(name):
             if char == ',':
                new_name = name[idx+1:])
                column_dict[name] = new_name
      title_file.rename(columns = column_dict, inplace = True)

Но перед установкой аргумента inplace как True просто проверьте результат

0 голосов
/ 20 июня 2020

Я предлагаю два изменения, которые могут помочь вам выяснить ошибку: во-первых, вместо использования while l oop используйте a вместо l oop и перебирайте элементы в списке заголовков. прежде чем пытаться устранить ошибку, попробуйте распечатать переменные этого списка, может быть заголовок типа Float, то есть число, которое вы не можете перебирать (или попытайтесь удалить специальные символы). Если есть такой заголовок, попробуйте создать два условия, используя операторы if, чтобы работать с каждым типом по-разному, вот что я имею в виду.

for x in title: #iterating over the list
    if type(title) == float or type(title) == int:
       #do something
    else:
       #do something else
...