我在pandas中有一个数据帧,我想写一个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。一个'to-tab'方法(我认为不存在)?
答案 0 :(得分:833)
要通过标签分隔,您可以使用to_csv
的sep
参数:
df.to_csv(file_name, sep='\t')
要使用特定编码(例如'utf-8'),请使用encoding
参数:
df.to_csv(file_name, sep='\t', encoding='utf-8')
答案 1 :(得分:181)
使用DataFrame
方法将to_csv
对象存储到 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
答案 2 :(得分:16)
如果您遇到与#ut;-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))
警告:错误='忽略'只会省略字符,例如
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
答案 3 :(得分:15)
如果您不需要索引。
df.to_csv("out.csv", index=False)
答案 4 :(得分:9)
如果您同时指定UTF-8编码,有时会遇到这些问题。 我建议您在写入文件时在读取文件和相同编码时指定编码。 这可能会解决您的问题。
答案 5 :(得分:4)
这可能不是这种情况的答案,但由于我与 .to_csv 有相同的错误消息,我尝试了 .toCSV(' name.csv' )并且错误消息不同("' SparseDataFrame'对象没有属性' toCSV'")。因此,通过将数据帧转换为密集数据帧来解决问题
df.to_dense().to_csv("submission.csv", index = False, sep=',', encoding='utf-8')
答案 6 :(得分:2)
要将熊猫DataFrame写入CSV文件,您将需要DataFrame.to_csv
。此函数提供许多具有合理默认值的参数,您将经常需要覆盖这些参数以适合您的特定用例。例如,您可能要使用其他分隔符,更改日期时间格式或在写入时删除索引。 to_csv
可以传递参数来满足这些要求。
这是一张表格,列出了一些写入CSV文件的常见情况以及可以用于它们的相应参数。
脚注
- 假定默认分隔符为逗号(
','
)。除非您知道需要,否则请勿更改。- 默认情况下,
df
的索引被写为第一列。如果您的DataFrame没有索引(IOW,df.index
是默认的RangeIndex
),则在写入时将需要设置index=False
。为了用另一种方式解释这一点,如果您的数据确实有索引,则可以(并且应该)使用index=True
或将其完全省略(默认值为True
)。- 如果要写入字符串数据,那么最好设置此参数,以便其他应用程序知道如何读取数据。这样也可以避免您在保存时可能遇到的
如果要将大型DataFrame(> 100K行)写入磁盘,建议使用UnicodeEncodeError
个潜在问题。- 压缩,因为压缩会导致输出文件小得多。 OTOH,这意味着写入时间将增加(因此, 读取时间,因为文件需要解压缩。)
答案 7 :(得分:2)
在Windows中使用完整路径导出文件的示例,如果文件具有标题:
res
例如,如果您想存储在脚本所在目录的文件夹中,并以 utf-8编码和选项卡作为分隔符:
df.to_csv (r'C:\Users\John\Desktop\export_dataframe.csv', index = None, header=True)
答案 8 :(得分:0)
如果 avobe 解决方案不适用于任何人或 CSV 被搞乱,只需像这样从行中删除 sep='\t'
:
df.to_csv(file_name, encoding='utf-8')
答案 9 :(得分:-1)
对于简单的csv数据框。在您的问题中还提供答案。这不是上述错误的答案
df.to_csv('output.csv')
我发帖是因为我在上面的答案中找到了csv的df,它显示了错误。