Запись DataFrame pandas в CSV файл
У меня есть датафрейм в pandas, который я хотел бы записать в CSV файл. Я делаю это с помощью следующей команды:
df.to_csv('out.csv')
Однако получаю следующую ошибку:
UnicodeEncodeError: 'ascii' codec can't encode character u'\u03b1' in position 20: ordinal not in range(128)
У меня есть несколько вопросов:
- Есть ли способ избежать этой ошибки (то есть у меня есть юникодные символы в датафрейме)?
- Можно ли записать данные в файл, разделенный табуляцией, вместо CSV, используя, например, метод 'to-tab' (которого, как я понимаю, не существует)?
5 ответ(ов)
Когда вы сохраняете объект 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
Конечно! Вот пример экспорта 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)
Не забудьте убедиться, что указанная директория существует, иначе вы получите ошибку при попытке записи файла.
Если у вас возникают проблемы с кодировкой в '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, а также обрабатывать возникающие исключения.
Если предложенное выше решение не сработало для вас или CSV-файл получается некорректным, просто уберите параметр sep='\t'
из строки, чтобы получилось так:
df.to_csv(file_name, encoding='utf-8')
Иногда вы сталкиваетесь с такими проблемами, если указываете кодировку UTF-8. Я рекомендую вам указывать кодировку при чтении файла и ту же кодировку при записи файла. Это может помочь решить вашу проблему.
Переименование названий столбцов в Pandas
"Красивая печать всей Series / DataFrame в Pandas"
Преобразование списка словарей в DataFrame pandas
Объединение двух столбцов текста в DataFrame pandas
Неоднозначное значение истинности Series. Используйте a.empty, a.bool(), a.item(), a.any() или a.all()