从python中的excel文件导入pandas DataFrame时出现类型错误

时间:2019-02-26 19:23:25

标签: python pandas

我正在尝试将pandas DataFrame保存为excel文件,然后再次导入并将其转换回字典。数据帧的尺寸很大。例如,考虑以下代码:

import pandas as pd

path = 'file.xlsx'
dict1 = {'a' : [3, [1, 2, 3], 'text1'],
         'b' : [4, [4, 5, 6, 7], 'text2']}
print('\n\nType 1:', type(dict1['a'][1]))

df1 = pd.DataFrame(dict1)
df1.to_excel(path, sheet_name='Sheet1')
print("\n\nSaved df:\n", df1 , '\n\n')

df2 = pd.read_excel(path, sheet_name='Sheet1')
print("\n\nLoaded df:\n", df2 , '\n\n')

dict2 = df2.to_dict(orient='list')
print("New dict:", dict2, '\n\n')
print('Type 2:', type(dict2['a'][1]))

输出为:

Type 1: <class 'list'>


Saved df:
            a             b
0          3             4
1  [1, 2, 3]  [4, 5, 6, 7]
2      text1         text2




Loaded df:
            a             b
0          3             4
1  [1, 2, 3]  [4, 5, 6, 7]
2      text1         text2


New dict: {'a': [3, '[1, 2, 3]', 'text1'], 'b': [4, '[4, 5, 6, 7]', 'text2']}


Type 2: <class 'str'>

您能帮我找回具有相同元素类型的原始词典吗? 谢谢!

1 个答案:

答案 0 :(得分:1)

现在,有一个read_excel选项,允许我们在读取列时更改它们的dtype,但是没有这样的选项来更改dtype的任何行。因此,在读取数据之后,我们必须自己进行类型转换。

正如您在问题中所显示的,df['a'][1]的类型为str,但您希望它的类型为list

因此,假设我们有一些字符串l ='[1, 2, 3]',我们可以将其转换为l=[1, 2, 3]的整数列表([int(val) for val in l.strip('[]').split(',')])。现在,我们可以将其与.apply方法结合使用来获得我们想要的东西:

df.iloc[1] = df.iloc[1].apply(lambda x : [int(val) for val in x.strip('[]').split(',')])

将这个示例放在一起,我们有:

import pandas as pd

# Data as read in by read_excel method
df2 = pd.DataFrame({'a' : [3, '[1, 2, 3]', 'text1'],
                   'b' : [4, '[4, 5, 6, 7]', 'text2']})
print('Type: ', type(df2['a'][1]))
#Type:  <class 'str'>

# Convert strings in row 1 to lists
df2.iloc[1] = df2.iloc[1].apply(lambda x : [int(val) for val in x.strip('[]').split(',')])

print('Type: ', type(df2['a'][1]))
#Type:  <class 'list'>

dict2 = df2.to_dict(orient='list')