我正在尝试在Python pandas中做一些数据工作,并且无法写出我的结果。 我将我的数据作为CSV文件读取并导出每个脚本,因为它自己的CSV文件工作正常。最近虽然我已经尝试将所有内容导出到包含工作表的1个Excel文件中,但是一些工作表给我一个错误
“'utf8'编解码器无法解码位置1中的字节0xe9:无效的连续字节”
我不知道如何开始查找可能导致导出到Excel的问题的任何字符。不知道为什么它输出到CSV就好了:(
相关专栏
from pandas import ExcelWriter
data = pd.read_csv(input)
writer = ExcelWriter(output) #output is just the filename
fundraisers.to_excel(writer, "fundraisers")
locations.to_excel(writer, "locations") #error
locations.to_csv(outputcsv) #works
writer.save()
违规数据框的打印头
Event ID Constituent ID Email Address First Name \ Last Name
f 1 A A 1
F 4 L R C
M 1 1 A D
F 4 A A G
M 2 0 R G
M 3 O O H
M 2 T E H
M 2 A A H
M 2 M M K
F 3 J E K
Location ID raised raised con raised email
a 0 0 0
a 8 0 0
o 0 0 0
o 0 0 0
o 0 0 0
t 5 0 0
o 1 0 0
o 6 a 0
o 6 0 0
d 0 0 0
查看excel表我确实得到了部分打印输出。名字列及其后的任何内容都是空白的,但事件,成分和电子邮件都是打印的。
编辑:尝试以utf8读取csv失败,但以latin1的形式读取它有效。有没有办法指定to_excel编码?或者将我的数据帧解码并编码为utf8?
答案 0 :(得分:20)
管理解决此问题。
我创建了一个函数,遍历我的列,这些列具有字符串并设法将它们解码/编码为utf8,现在它可以正常工作。
def changeencode(data, cols):
for col in cols:
data[col] = data[col].str.decode('iso-8859-1').str.encode('utf-8')
return data
答案 1 :(得分:13)
在我的情况下,问题是我最初正在使用错误的编码<{1}}而不是ASCII
读取 CSV文件。因此,当pandas尝试将其写入Excel文件时,它会发现一些无法解码的字符。
我通过在读取CSV文件时指定正确的编码来解决它。
cp1252
答案 2 :(得分:5)
实际上,有一种方法可以通过将参数传递给ExcelWriter来强制执行utf8编码:
ew = pandas.ExcelWriter('test.xlsx',options={'encoding':'utf-8'})
sampleList = ['Miño', '1', '2', 'señora']
dataframe = pandas.DataFrame(sampleList)
dataframe.to_excel(ew)
ew.save()
答案 3 :(得分:2)
最简单的方法是在utf-8中加载数据帧。然后它ExcelWriter将保存它没有问题。
data = pd.read_csv(path,encoding='utf-8')
答案 4 :(得分:1)
不知道什么时候会发布,但你可以尝试使用我的github存储库:
https://github.com/jtornero/pandas
您可以克隆它并从源代码构建pandas;问题几乎已经解决,就像
一样sampleList = ['Miño', '1', '2', 'señora']
dataframe = pandas.DataFrame(sampleList)
ew = pandas.ExcelWriter('./test.xls', encoding='utf-8')
dataframe.to_excel(ew)
ew.save()
干杯
Jorge Tornero
答案 5 :(得分:0)
要什么被@Zenadix所述,读取为UTF-8允许ExcelWriter到写入没有错误的CSV中相似
df = pd.read_csv('path', encoding='utf-8')
...
with pd.ExcelWriter('new_path') as writer:
df.to_excel(writer, sheet_name='Foo')