【问题标题】:Reading pandas dataframe that contains dictionaries in cells from csv读取包含来自csv的单元格中的字典的熊猫数据框
【发布时间】:2026-02-18 10:25:04
【问题描述】:

我将如下所示的 pandas 数据框保存为 csv 文件。

    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 文件以恢复与创建时相同的格式的数据帧。我也尝试过阅读 without dtype={} 以及 replace 'dict' 等替代品“字典”、“对象”和“字符串”。

【问题讨论】:

  • 是的,同样的错误

标签: python pandas dataframe csv dictionary


【解决方案1】:

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 最适用于连续的内存块,例如将数字数据分成数字系列。

【讨论】:

  • 您对存储字典有何建议?
  • 我的建议是重新格式化。有一列用于您的字符串键,另一列用于您的数值。关于这个有很多问题,但是如果你遇到困难,欢迎你提出一个新的问题。
【解决方案2】:

你也可以使用简单的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

【讨论】:

  • 你的答案和上面的有什么区别!?
【解决方案3】:

您也可以在读取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'])

【讨论】:

  • 在这个阶段进行转换,而不是在读入后的应用调用中,帮助我避免了 ValueError: malformed node or string: nan 问题。谢谢!