带有to_excel()的pandas Unicode导出导出错误read_excel()

时间:2017-02-03 11:23:36

标签: python string pandas unicode export-to-excel

早晨。

我将更大的情况浓缩到以下内容:

我有一个文件,其数据框中包含一些值。

df = pd.DataFrame(
{'joe': [['dog'], ['cat'], ['fish'], ['rabbit']], 'ben': [['dog'], ['fish'], ['fish'], ['bear']]})

df:
      ben       joe
0   [dog]     [dog]
1  [fish]     [cat]
2  [fish]    [fish]
3  [bear]  [rabbit]

此数据框中包含的数据类型如下:

type(df.iloc[2,1]),df.iloc[2,1]
>>> (list, ['fish'])

使用pd.to_excel()

将数据框保存到Excel时
writer1 = pd.ExcelWriter('Input Output Test.xlsx')
df.to_excel(writer1,'Sheet1')
writer1.save()

我立即将其读回到同一文件中,如下所示:

dfi = pd.read_excel(open('Input Output Test.xlsx'), sheetname='Sheet1')

我再次测试数据的类型:

type(dfi.iloc[2,1]),dfi.iloc[2,1]
>>> (unicode, u"['fish']")

现在数据采用unicode格式。这是有问题的,因为当我比较两个数据帧如下时,由于不匹配的字符串格式,所有结果都是错误的:

np.where(df['joe'] == dfi['joe'],True,False)
dfi:
        ben         joe   test
0   ['dog']     ['dog']  False
1  ['fish']     ['cat']  False
2  ['fish']    ['fish']  False
3  ['bear']  ['rabbit']  False

导致此更改的读取和写入过程中发生了什么,以及如何更改它以保存str格式保存?

E:不幸的是,我的问题的本质要求必须保存数据帧,并在不同的文件中进行操作。

编辑,以响应EdChum的评论:如果我将这些字符串存储为字符串,而不是列表:我仍然得到相同的错误:

df = pd.DataFrame({'joe': ['dog', 'cat', 'fish', 'rabbit'], 'ben': ['dog', 'fish', 'fish', 'bear']})

    ben     joe
0   dog     dog
1  fish     cat
2  fish    fish
3  bear  rabbit

writer1 = pd.ExcelWriter('Input Output Test Joe.xlsx')
df.to_excel(writer1,'Sheet1')
writer1.save()

dfi = pd.read_excel(open('Input Output Test Joe.xlsx','rb'), sheetname='Sheet1')

type(dfi.iloc[2, 1]), dfi.iloc[2, 1]
(unicode, u'fish')

再次,比较失败。

编辑: 如下所述,也可以通过ast.literal_eval()将Unicode评估为常规字符串: Convert string representation of list to list in Python或EdChum的建议。

注意:如果您使用to_csv()read_csv(),则此问题不存在。

但为什么to_excel() / re_excel()会更改原始代码?

1 个答案:

答案 0 :(得分:1)

  

但是为什么to_excel()/ re_excel()会更改原始代码?

我不知道。我简要查看了to_excel from_excel的来源,但找不到任何线索。
设置engine='xlsxwriter'并将encoding设置为默认值似乎可以做到这一点,即:

import pandas as pd
df = pd.DataFrame(
    {'joe': [['dog'], ['cat'], ['fish'], ['rabbit']], 'ben': [['dog'], ['fish'], ['fish'], ['bear']]})

with pd.ExcelWriter ('Input Output Test.xlsx') as writer:
    df.to_excel(writer, sheet_name='Sheet1', engine='xlsxwriter')

dfi = pd.read_excel('Input Output Test.xlsx')

assert eval(dfi.iloc[2,1]) == df.iloc[2,1]
# True