我在 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 字符)?
有没有办法使用例如'to-tab'方法(我认为不存在)写入制表符分隔文件而不是CSV?
要按制表符分隔,您可以使用 to_csv
的 sep
参数:
df.to_csv(file_name, sep='\t')
要使用特定编码(例如 'utf-8'),请使用 encoding
参数:
df.to_csv(file_name, sep='\t', encoding='utf-8')
当您使用 to_csv
方法将 DataFrame
对象存储到 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
df.rename_axis('index_name')
吗?不会改变文件本身
要将 pandas DataFrame 写入 CSV 文件,您需要 DataFrame.to_csv
。此函数提供了许多具有合理默认值的参数,您经常需要覆盖这些参数以适合您的特定用例。例如,您可能希望使用不同的分隔符、更改日期时间格式或在写入时删除索引。 to_csv
具有您可以传递的参数来满足这些要求。
下表列出了写入 CSV 文件的一些常见场景以及可用于它们的相应参数。
https://i.stack.imgur.com/RsIO7.png
脚注 默认分隔符假定为逗号 (',')。除非您知道需要,否则不要更改此设置。默认情况下,df 的索引写为第一列。如果您的 DataFrame 没有索引(IOW,df.index 是默认的 RangeIndex),那么您将需要在编写时设置 index=False。以不同的方式解释这一点,如果您的数据确实有索引,您可以(并且应该)使用 index=True 或完全不使用它(默认为 True)。如果您正在写入字符串数据,最好设置此参数,以便其他应用程序知道如何读取您的数据。这也将避免您在保存时可能遇到的任何潜在的 UnicodeEncodeErrors。如果您将大型 DataFrame(>100K 行)写入磁盘,建议使用压缩,因为它会导致输出文件更小。 OTOH,这意味着写入时间会增加(因此,文件需要解压缩后的读取时间)。
在 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”时遇到问题并且想要逐个单元格地进行操作,则可以尝试其他方法,您可以尝试以下操作。
蟒蛇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'
蟒蛇 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 编码,有时您会遇到这些问题。我建议您在读取文件时指定编码,在写入文件时指定相同的编码。这可能会解决您的问题。
这可能不是这种情况的答案,但由于我与 .to_csv
有相同的错误消息,我尝试了 .toCSV('name.csv')
并且错误消息不同(“SparseDataFrame' object has no attribute 'toCSV'
)。所以通过转动数据框解决了问题密集数据框
df.to_dense().to_csv("submission.csv", index = False, sep=',', encoding='utf-8')
.toCSV
而不是 .to_csv
。你忘了下划线
如果上述解决方案对任何人都不起作用或 CSV 被弄乱了,只需从行中删除 sep='\t'
,如下所示:
df.to_csv(file_name, encoding='utf-8')
我会避免单独使用 '\t' 并在再次读取数据集时会产生问题。
df.to_csv(file_name, encoding='utf-8')
index=False
以删除索引。.csv
结束您的文件名 我不承认有多少次我忘记这样做了。to_csv
来编写制表符分隔文件是否有特殊原因?