读取包含来自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的单元格中的字典的熊猫数据框的主要内容,如果未能解决你的问题,请参考以下文章