11

Запись DataFrame pandas в CSV файл

28

У меня есть датафрейм в pandas, который я хотел бы записать в CSV файл. Я делаю это с помощью следующей команды:

df.to_csv('out.csv')

Однако получаю следующую ошибку:

UnicodeEncodeError: 'ascii' codec can't encode character u'\u03b1' in position 20: ordinal not in range(128)

У меня есть несколько вопросов:

  1. Есть ли способ избежать этой ошибки (то есть у меня есть юникодные символы в датафрейме)?
  2. Можно ли записать данные в файл, разделенный табуляцией, вместо CSV, используя, например, метод 'to-tab' (которого, как я понимаю, не существует)?

5 ответ(ов)

3

Когда вы сохраняете объект DataFrame в CSV-файл, используя метод to_csv, вам, вероятно, не нужно сохранять предшествующие индексы каждой строки объекта DataFrame.

Вы можете избежать этого, передав значение False для параметра index.

Пример использования:

df.to_csv(file_name, encoding='utf-8', index=False)

Таким образом, если ваш объект DataFrame выглядит следующим образом:

  Color  Number
0   red     22
1  blue     10

То CSV-файл будет сохранять:

Color,Number
red,22
blue,10

вместо (случая, когда было передано значение по умолчанию True):

,Color,Number
0,red,22
1,blue,10
0

Конечно! Вот пример экспорта DataFrame в файл с полным путем на Windows и в случае, если ваш файл имеет заголовки:

df.to_csv(r'C:\Users\John\Desktop\export_dataframe.csv', index=None, header=True)

Например, если вы хотите сохранить файл в той же директории, где находится ваш скрипт, использовать кодировку utf-8 и табуляцию в качестве разделителя, можно сделать так:

df.to_csv(r'./export/dftocsv.csv', sep='\t', encoding='utf-8', header=True)

Не забудьте убедиться, что указанная директория существует, иначе вы получите ошибку при попытке записи файла.

0

Если у вас возникают проблемы с кодировкой в 'utf-8' и вы хотите обрабатывать данные по ячейкам, вы можете попробовать следующий подход.

Python 2

(Где "df" — это ваш объект DataFrame.)

for column in df.columns:
    for idx in df[column].index:
        x = df.get_value(idx, column)
        try:
            x = unicode(x.encode('utf-8', 'ignore'), errors='ignore') if type(x) == unicode else unicode(str(x), errors='ignore')
            df.set_value(idx, column, x)
        except Exception:
            print 'ошибка кодировки: {0} {1}'.format(idx, column)
            df.set_value(idx, column, '')
            continue

Затем попробуйте:

df.to_csv(file_name)

Вы можете проверить кодировку столбцов следующим образом:

for column in df.columns:
    print '{0} {1}'.format(str(type(df[column][0])), str(column))

Предупреждение: использование errors='ignore' просто пропустит символ, например:

IN: unicode('Regenexx\xae', errors='ignore')
OUT: u'Regenexx'

Python 3

for column in df.columns:
    for idx in df[column].index:
        x = df.get_value(idx, column)
        try:
            x = x if type(x) == str else str(x).encode('utf-8', 'ignore').decode('utf-8', 'ignore')
            df.set_value(idx, column, x)
        except Exception:
            print('ошибка кодировки: {0} {1}'.format(idx, column))
            df.set_value(idx, column, '')
            continue

Этот код обрабатывает проблемы с кодировкой в DataFrame, проходя по каждой ячейке и пытаясь преобразовать значения в строку UTF-8, а также обрабатывать возникающие исключения.

0

Если предложенное выше решение не сработало для вас или CSV-файл получается некорректным, просто уберите параметр sep='\t' из строки, чтобы получилось так:

df.to_csv(file_name, encoding='utf-8')
0

Иногда вы сталкиваетесь с такими проблемами, если указываете кодировку UTF-8. Я рекомендую вам указывать кодировку при чтении файла и ту же кодировку при записи файла. Это может помочь решить вашу проблему.

Чтобы ответить на вопрос, пожалуйста, войдите или зарегистрируйтесь