读取包含来自csv的单元格中的字典的pandas数据帧

时间:2018-06-07 00:00:04

标签: python pandas csv dataframe

我保存了一个像csv文件一样的pandas数据框。

    a
0 {'word': 5.7}
1 {'khfds': 8.34}

当我尝试读取如下所示的数据帧时,收到以下错误。

df = pd.read_csv('foo.csv', index_col=0, dtype={'str': 'dict'})

TypeError: data type "dict" not understood

我的问题的核心是如何读取csv文件以与创建时相同的形式恢复数据框。我也尝试阅读 dtype = {} 以及替换 'dict'与其他替代方案'字典','对象'和'str'。

3 个答案:

答案 0 :(得分:2)

CSV文件可能只包含文本,因此词典超出范围。因此,您需要从字面上阅读文本以转换为dict。一种方法是使用ast.literal_eval

import pandas as pd
from ast import literal_eval
from io import StringIO

mystr = StringIO("""a
{'word': 5.7}
{'khfds': 8.34}""")

df = pd.read_csv(mystr)

df['a'] = df['a'].apply(literal_eval)

print(df['a'].apply(lambda x: type(x)))

0    <class 'dict'>
1    <class 'dict'>
Name: a, dtype: object

但是,我强烈建议您专门使用Pandas来存储指向词典的指针。 Pandas最适用于连续的内存块,例如:将数字数据分成数字系列。

答案 1 :(得分:0)

您还可以如下使用普通和简单的python eval:

import pandas as pd
from io import StringIO

mystr = StringIO("""a
{'word': 5.7}
{'khfds': 8.34}""")

df = pd.read_csv(mystr)

df['a'] = df['a'].apply(eval)

print(df['a'].apply(lambda x: type(x)))

0    <class 'dict'>
1    <class 'dict'>
Name: a, dtype: object

答案 2 :(得分:0)

您也可以在读取 csv 文件时直接转换为字典,如下所示:

import pandas as pd
from ast import literal_eval
from io import StringIO

mystr = StringIO("""a
{'word': 5.7}
{'khfds': 8.34}""")

df = pd.read_csv(mystr, converters={'a': literal_eval})

print(df.iloc[0]['a']['word'])