繁体   English   中英

阅读 pandas dataframe 包含来自 csv 的单元格中的字典

[英]Reading pandas dataframe that contains dictionaries in cells from csv

我将如下所示的 pandas dataframe 保存为 csv 文件。

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

当我尝试如下所示读取 dataframe 时,我收到以下错误。

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

TypeError: data type "dict" not understood

我的问题的核心是如何读取 csv 文件以恢复 dataframe 与创建时相同的形式。 我也试过在没有dtype={}的情况下阅读以及用诸如“dictionary”、“object”和“str”之类的替代项替换“dict ”。

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

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

(我没有足够的声誉来发表评论)即使在给出 ast.literal_eval 之后,我在某些 dict 列上也有“ValueError:节点或字符串格式错误”。

修复字典中的间距,为我解决了这个问题。 例子 -

ast.literal_eval("{'word': 5.7}, {'khfds': 8.34}")

ast.literal_eval("{'word': 5.7}, {'khfds': 8.34}")

希望这对某人有帮助

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM