读取包含来自csv的单元格中的字典的熊猫数据框

Posted

技术标签:

【中文标题】读取包含来自csv的单元格中的字典的熊猫数据框【英文标题】:Reading pandas dataframe that contains dictionaries in cells from csv 【发布时间】:2018-11-16 18:42:22 【问题描述】:

我将如下所示的 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' 等替代品“字典”、“对象”和“字符串”。

【问题讨论】:

是的,同样的错误 【参考方案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 问题。谢谢!

以上是关于读取包含来自csv的单元格中的字典的熊猫数据框的主要内容,如果未能解决你的问题,请参考以下文章

在熊猫数据框单元格中插入列表

如何在熊猫数据框单元格中提取部分字符串并在其中创建一个包含该字符串的新列

根据“如果单元格中的字符串”条件删除熊猫列中的行

从熊猫数据框单元格中的凌乱字符串中删除换行符?

列表追加到熊猫单元格中

读取存储在文本文件中的字典并转换为熊猫数据框[重复]