Запись DataFrame для панд в файл CSV

У меня есть dataframe в 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" (который, как я думаю, не существует)?

Ответ 1

Чтобы разграничить вкладку, вы можете использовать аргумент sep to_csv:

df.to_csv(file_name, sep='\t')

Чтобы использовать конкретную кодировку (например, "utf-8" ), используйте аргумент encoding:

df.to_csv(file_name, sep='\t', encoding='utf-8')

Ответ 2

Когда вы DataFrame объект DataFrame в файле csv с to_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

Ответ 3

Если вы не хотите индекс.

 df.to_csv("out.csv", index=False)

Ответ 4

Что-то еще вы можете попробовать, если у вас проблемы с кодировкой на "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 'encoding error: {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('encoding error: {0} {1}'.format(idx,column))
            df.set_value(idx,column,'')
            continue

Ответ 5

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

Ответ 6

это может быть не ответом на этот случай, но поскольку у меня было такое же сообщение об ошибке с .to_csv, я попытался .toCSV('name.csv'), и сообщение об ошибке было другим (объект "SparseDataFrame" не имеет атрибута ' toCSV "). Таким образом, проблема была решена путем преобразования данных в плотную область данных

df.to_dense().to_csv("submission.csv", index = False, sep=',', encoding='utf-8')

Ответ 7

Для записи DataFrame pandas в CSV файл вам понадобится DataFrame.to_csv. Эта функция предлагает множество аргументов с разумными значениями по умолчанию, которые вам чаще всего придется переопределять в соответствии с вашим конкретным вариантом использования. Например, вы можете использовать другой разделитель, изменить формат даты и времени или удалить индекс при записи. to_csv имеет аргументы, которые вы можете передать для удовлетворения этих требований.

Вот таблица, в которой перечислены некоторые распространенные сценарии записи в файлы CSV и соответствующие аргументы, которые вы можете использовать для них.

Write to CSV ma dude

Сноски

  1. Разделителем по умолчанию считается запятая (','). Не меняйте это, если не знаете, что вам нужно.
  2. По умолчанию индекс df записывается как первый столбец. Если DataFrame не имеет индекс (IOW, то df.index по умолчанию RangeIndex), то вам нужно будет установить index=False при написании. Чтобы объяснить это по-другому, если ваши данные имеют индекс, вы можете (и должны) использовать index=True или просто не указывать его (по умолчанию True).
  3. Было бы разумно установить этот параметр, если вы пишете строковые данные, чтобы другие приложения знали, как читать ваши данные. Это также позволит избежать любого потенциального UnicodeEncodeError вы можете столкнуться при сохранении.
  4. Сжатие рекомендуется, если вы записываете большие DataFrames (> 100K строк) на диск, так как это приведет к гораздо меньшим выходным файлам. OTOH, это будет означать, что время записи увеличится (и, следовательно, время чтения, так как файл необходимо будет распаковать).

Ответ 8

df.to_csv('out.csv', sep=',')

Он будет работать определенно.

Измените df на имя имени вашей базы данных и запустите.

Используйте anaconda в режиме ожидания.

Ответ 9

Для простого dataframe to csv. На ваш вопрос ответ также присутствует. Это не ответ на вышеуказанную ошибку.

df.to_csv('output.csv')

Я публикую, потому что я нашел df для csv, я использую выше ответы, это показывает ошибку.

Ответ 10

Пример экспорта в файл с полным путем в 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')