从csv文件中读取包含字典的pandas dataframe

10

我将一个类似以下格式的熊猫数据框保存成了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文件以恢复数据框,使其与创建时的形式相同。我还尝试过不使用 dtype={} 以及用'字典'、'对象'和'str'等替换'dict'

4个回答

5

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


你会建议使用什么来存储字典? - TommyTorty10
2
我的建议是重新格式化。为您的字符串键设置一列,为您的数字值设置另一列。在SO上有许多关于此问题的问题,但如果您遇到困难,欢迎提出新问题。 - jpp

4

当你读取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”问题。谢谢! - 10mjg

0

(我没有足够的声望来评论)即使在使用ast.literal_eval时,对于一些字典列,我仍然遇到了“ValueError:malformed node or string”错误。

通过修复字典中的空格,问题得到了解决。 例如 -

之前

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

之后

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

希望这可以帮助到某些人


-3

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

1
你的答案和上面的答案有什么区别? - Hadij

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接