上下文:我正在尝试构建一个可追溯的热图,以映射以下类型的数据(在数据框中):

python - UnicodeDecodeError帮助:数据需要以ascii格式存储,但源代码为utf-8-LMLPHP

(最多可容纳50个水果和5500家商店)

我的问题(我认为)是seaborn似乎要使用ascii,但我的数据在utf-8中。读取csv文件时,无法执行以下操作:

df = pd.read_csv('data.csv', encoding = 'ascii')


没有出现以下错误:

UnicodeDecodeError: 'ascii' codec can't decode byte 0xe9 in position 3: ordinal not in range(128)


当我使用utf-8引入它时,它将读取并且可以将其重塑为对热图友好的形式,但是随后尝试运行时:

sns.heatmap(df2)


我得到类似的UnicodeDecodeError

我在商店或水果园中确实有一些简单的特殊字符(冒号,退格键等),所以我想知道这里最好的方法是什么。


我是否应该在数据框上运行某些内容以删除utf-8字符
然后编码为ASCII?
我应该对源.csv文件做些什么来删除utf-8字符吗?
我可以通过其他方式让Seaborn接受我拥有的编码吗?


如果有人有首选的方法,他们可以帮助我提供适当的代码来完成它吗?

Python版本2.7.12 :: Anaconda 4.1.1(64位)
熊猫(0.18.1)
Seaborn(0.7.1)

最佳答案

您的配置(Python 2.7,Pandas 0.18.1,Seaborn 0.7.1)当然应该能够处理utf-8。即使绘图中使用的字体不支持这些unicode字符,热图仍应显示。这是一个测试案例:

import pandas as pd
import seaborn as sns

df = pd.DataFrame(
        {'Fruit': ['Apple', 'Banana', 'Orange', 'Kiwi'] * 2,
        'Store': [u'Kr\xf6ger'] * 4 + [u'F\u0254\u0254d Li\u01ebn'] * 4,
        'Stock': [6, 1, 3, 4, 1, 7, 7, 9]})

sns.heatmap(df.pivot("Fruit", "Store", "Stock"))


因此,问题出在数据框df2中。您的评论指出,df2是通过重塑另一个数据框而创建的,可能也由诸如pivot()crosstab()之类的东西构成。

假设此原始数据帧包含列StoreFruit,并且它是从文件中读取的,即采用默认编码:

raw = pd.read_csv('data.csv')


为了进行测试,这是该文件data.csv的内容:

Store,Fruit,Stock
Kröger,Apple,6
Kröger,Banana,1
Kröger,Orange,3
Kröger,Kiwi,4
Fɔɔd Liǫn,Apple,1
Fɔɔd Liǫn,Banana,7
Fɔɔd Liǫn,Orange,7
Fɔɔd Liǫn,Kiwi,9


现在,为了修复列StoreFruit的编码,使其包含有效的Unicode字符串,请使用decode()字符串方法,如下所示:

raw["Store"] = raw["Store"].apply(lambda x: x.decode("utf-8"))
raw["Fruit"] = raw["Fruit"].apply(lambda x: x.decode("utf-8"))


现在,heatmap()应该可以很愉快地使用数据框:

sns.heatmap(raw.pivot("Fruit", "Store", "Stock"))

关于python - UnicodeDecodeError帮助:数据需要以ascii格式存储,但源代码为utf-8,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/39919704/

10-12 16:39
查看更多