Pandas数据框和字符编码在读取Excel文件时的问题

15

我正在阅读一个包含多个数值和分类数据的Excel文件。其中列名“name_string”包含一种外语字母。 当我尝试查看“name_string”列的内容时,我得到了我想要的结果,但是外语字母(在Excel电子表格中正确显示)却显示出了错误的编码。 以下是我的代码:

import pandas as pd
df = pd.read_excel('MC_simulation.xlsx', 'DataSet', encoding='utf-8')
name_string = df.name_string.unique()
name_string.sort()
name_string

生成以下内容:

array([u'4th of July', u'911', u'Abab', u'Abass', u'Abcar', u'Abced',
       u'Ceded', u'Cedes', u'Cedfus', u'Ceding', u'Cedtim', u'Cedtol',
       u'Cedxer', u'Chevrolet Corvette', u'Chuck Norris',
       u'Cristina Fern\xe1ndez de Kirchner'], dtype=object)
在最后一行,正确编码的姓名应该是Cristina Fernández de Kirchner。有人可以帮我解决这个问题吗?
1个回答

16

实际上,数据被正确地解析为unicode而不是strs。前缀u表示这些对象是unicode类型。当打印列表、元组或NumPy数组时,Python会显示序列中项目的repr。因此,您看到的是repr而非unicode的打印版本:

In [160]: repr(u'Cristina Fern\xe1ndez de Kirchner')
Out[160]: "u'Cristina Fern\\xe1ndez de Kirchner'"

In [156]: print(u'Cristina Fern\xe1ndez de Kirchner')
Cristina Fernández de Kirchner

repr的目的是为每个对象提供一个不含歧义的字符串表示。由于不可见或无法打印的字符,Unicode的打印版本可能会产生歧义。

但是如果您打印DataFrame或Series,则会得到Unicode的打印版本:

In [157]: df = pd.DataFrame({'foo':np.array([u'4th of July', u'911', u'Abab', u'Abass', u'Abcar', u'Abced',
       u'Ceded', u'Cedes', u'Cedfus', u'Ceding', u'Cedtim', u'Cedtol',
       u'Cedxer', u'Chevrolet Corvette', u'Chuck Norris',
       u'Cristina Fern\xe1ndez de Kirchner'], dtype=object)})
   .....:    .....:    .....: 
In [158]: df
Out[158]: 
                               foo
0                      4th of July
1                              911
2                             Abab
3                            Abass
4                            Abcar
5                            Abced
6                            Ceded
7                            Cedes
8                           Cedfus
9                           Ceding
10                          Cedtim
11                          Cedtol
12                          Cedxer
13              Chevrolet Corvette
14                    Chuck Norris
15  Cristina Fernández de Kirchner

[16 rows x 1 columns]

1
非常感谢@unutbu。回答非常出色,为我澄清了不止一个模糊的问题。干杯! - Luis Miguel
当我们将值保存到列表中并需要打印该列表时,如何解决相同的问题。我希望能够看到正确的字符。 - Sigur
@Sigur:打印列表会导致Python在逗号分隔的列表项repr周围打印括号。如果您想要项目的str,则需要自己组合。如果列表中的对象是bytes而不是(Python3)str,则还需要解码字节。如果这个解释和链接没有完全回答您的问题,请使用所有细节(列表的示例片段和所需输出)打开一个新问题。 - unutbu
1
@unutbu,谢谢。这个链接非常有用。离题一下:每次我读到你的昵称时,我都会把它读成“ubuntu”。哈哈 - Sigur

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接