use*_*289 612 python csv dataframe pandas
我在pandas中有一个数据帧,我想写一个CSV文件.我这样做使用:
df.to_csv('out.csv')
Run Code Online (Sandbox Code Playgroud)
并得到错误:
UnicodeEncodeError: 'ascii' codec can't encode character u'\u03b1' in position 20: ordinal not in range(128)
Run Code Online (Sandbox Code Playgroud)
有没有办法轻松解决这个问题(即我的数据框中有unicode字符)?有没有办法使用例如'to-tab'方法(我认为不存在)写入制表符分隔文件而不是CSV?
And*_*den 928
要通过选项卡进行分隔,可以使用以下sep
参数to_csv
:
df.to_csv(file_name, sep='\t')
Run Code Online (Sandbox Code Playgroud)
要使用特定的编码(例如'utf-8'),请使用以下encoding
参数:
df.to_csv(file_name, sep='\t', encoding='utf-8')
Run Code Online (Sandbox Code Playgroud)
Say*_*Sil 206
我想的东西添加到什么安迪·海登在他的答案已经提到.
当你存储DataFrame
对象转换成csv文件使用to_csv
方法,你大概不会需要存储前指数各行的的DataFrame
对象.
您可以通过将布尔值传递给参数来避免这种情况.False
index
有点像:
df.to_csv(file_name, encoding='utf-8', index=False)
Run Code Online (Sandbox Code Playgroud)
因此,如果您的DataFrame对象是这样的:
Color Number
0 red 22
1 blue 10
Run Code Online (Sandbox Code Playgroud)
csv文件将存储:
Color,Number
red,22
blue,10
Run Code Online (Sandbox Code Playgroud)
而不是(传递默认值 的情况True
)
,Color,Number
0,red,22
1,blue,10
Run Code Online (Sandbox Code Playgroud)
发现值得分享,干杯!:-)
Sha*_*han 21
如果上述解决方案对任何人都不起作用或者 CSV 变得混乱,只需sep='\t'
从该行中删除,如下所示:
df.to_csv(file_name, encoding='utf-8')
Run Code Online (Sandbox Code Playgroud)
Har*_*vey 18
在 Windows 上使用完整路径导出文件的示例,如果您的文件有标题:
df.to_csv (r'C:\Users\John\Desktop\export_dataframe.csv', index = None, header=True)
Run Code Online (Sandbox Code Playgroud)
例如,如果要将文件存储在脚本所在的同一目录中,使用utf-8 编码和制表符作为分隔符:
df.to_csv(r'./export/dftocsv.csv', sep='\t', encoding='utf-8', header='true')
Run Code Online (Sandbox Code Playgroud)
Gle*_*son 16
如果您遇到编码为'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
Run Code Online (Sandbox Code Playgroud)
然后尝试:
df.to_csv(file_name)
Run Code Online (Sandbox Code Playgroud)
您可以通过以下方式检查列的编码:
for column in df.columns:
print '{0} {1}'.format(str(type(df[column][0])),str(column))
Run Code Online (Sandbox Code Playgroud)
警告:errors ='ignore'只会省略字符,例如
IN: unicode('Regenexx\xae',errors='ignore')
OUT: u'Regenexx'
Run Code Online (Sandbox Code Playgroud)
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
Run Code Online (Sandbox Code Playgroud)
这可能不是这种情况的答案,但是由于我.to_csv
尝试了相同的错误消息.toCSV('name.csv')
并且错误消息不同(“ SparseDataFrame' object has no attribute 'toCSV'
)。因此通过将数据帧转换为密集数据帧解决了问题
df.to_dense().to_csv("submission.csv", index = False, sep=',', encoding='utf-8')
Run Code Online (Sandbox Code Playgroud)
要将pandas DataFrame写入CSV文件,您将需要DataFrame.to_csv
。此函数提供许多具有合理默认值的参数,您将经常需要覆盖这些参数以适合您的特定用例。例如,您可能要使用其他分隔符,更改日期时间格式或在写入时删除索引。to_csv
您可以通过传递参数来满足这些要求。
下表列出了一些写入CSV文件的常见情况以及可以用于它们的相应参数。
脚注
- 假定默认的分隔符为逗号(
','
)。除非您知道需要,否则请勿更改此设置。- 默认情况下,的索引
df
写为第一列。如果您的DataFrame没有索引(IOW,df.index
默认值为RangeIndex
),那么您将index=False
在写入时进行设置。以另一种方式解释这一点,如果您的数据确实有索引,则可以(并且应该)使用index=True
或完全不使用它(默认值为True
)。- 如果要写入字符串数据,则最好设置此参数,以便其他应用程序知道如何读取数据。这样也可以避免
UnicodeEncodeError
您在保存时可能遇到的任何潜在问题。- 如果要将大的DataFrame(> 100K行)写入磁盘,建议使用压缩,因为压缩会导致输出文件小得多。OTOH,这意味着写入时间将增加(因此,由于文件需要解压缩,因此读取时间也将增加)。
归档时间: |
|
查看次数: |
1217238 次 |
最近记录: |