早晨。
我将更大的情况浓缩到以下内容:
我有一个文件,其数据框中包含一些值。
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()
:
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()
会更改原始代码?
答案 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