У меня есть структура данных в пандах, которую я хотел бы записать в файл CSV. Я делаю это, используя:
df.to_csv('out.csv')
И получить ошибку:
UnicodeEncodeError: 'ascii' codec can't encode character u'\u03b1' in position 20: ordinal not in range(128)
Есть ли способ обойти это легко (т.е. У меня есть символы Unicode в моей рамке данных)? И есть ли способ записать в файл с разделителями вкладок вместо CSV, например, используя. метод «в-таб» (который я не думаю, что существует)?
Чтобы разделить вкладкой, вы можете использовать аргумент sep
to_csv
:
df.to_csv(file_name, sep='\t')
Использовать определенную кодировку (например,. 'utf-8') использовать аргумент encoding
:
df.to_csv(file_name, sep='\t', encoding='utf-8')
Когда вы храните объект 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
Что-то еще, что вы можете попробовать, если у вас возникли проблемы с кодированием «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))
Предупреждение: ошибки = '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
Иногда вы сталкиваетесь с этими проблемами, если также указываете кодировку UTF-8. Я рекомендую вам указать кодировку при чтении файла и ту же кодировку при записи в файл. Это может решить вашу проблему.
Чтобы записать Pandas DataFrame в файл CSV, вам потребуется DataFrame.to_csv
. Эта функция предлагает множество аргументов с разумными значениями по умолчанию, которые вам чаще всего придется переопределять в соответствии с вашим конкретным вариантом использования. Например, вы можете использовать другой разделитель, изменить формат datetime или сбросить индекс при записи. to_csv
имеет аргументы, которые вы можете передать для выполнения этих требований.
Вот таблица, в которой перечислены некоторые распространенные сценарии записи в файлы CSV и соответствующие аргументы, которые вы можете использовать для них.
Сноски
- Разделитель по умолчанию считается запятой (
','
). Не меняйте это, если не знаете, что вам нужно.- По умолчанию индекс
df
записывается как первый столбец. Если у вашей DataFrame нет индекса (IOW,df.index
- этоRangeIndex
по умолчанию), то при записи вы захотите установитьindex = False
. Чтобы объяснить это по-другому, если ваши данные имеют индекс, вы можете (и должны) использоватьindex = True
или просто полностью исключить его (по умолчаниюTrue
).- Было бы целесообразно установить этот параметр, если вы пишете строковые данные, чтобы другие приложения знали, как читать ваши данные. Это также позволит избежать любых потенциальных
UnicodeEncodeError
, с которыми вы можете столкнуться при сохранении.- Сжатие рекомендуется, если вы записываете большие DataFrames (> 100K строк) на диск, так как это приведет к гораздо меньшим выходным файлам. OTOH, это будет означать, что время записи увеличится (и, следовательно, время чтения, так как файл нужно будет распаковать).
это может быть не ответ для этого случая, но поскольку у меня было то же сообщение об ошибке с < i > .to_csv < / i > Я попробовал < i > .toCSV ('name.csv') < / i > и сообщение об ошибке было другим (объект '' SparseDataFrame' не имеет атрибута '). Таким образом, проблема была решена путем преобразования планера данных в плотный планер данных
df.to_dense().to_csv("submission.csv", index = False, sep=',', encoding='utf-8')
Пример экспорта в файл с полным путем в 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')