将具有 nan 值的 str 类型字典转换为字典类型对象

Posted

技术标签:

【中文标题】将具有 nan 值的 str 类型字典转换为字典类型对象【英文标题】:Convert str type dicts with nan values to dict type objects 【发布时间】:2021-08-29 18:56:11 【问题描述】:

类似的问题已经被问过很多次了,但令人惊讶的是,似乎很少有答案能解决我认为的问题。

我有一个或多个列的 csv 文件,每个单元格中都包含一个字典。在read_csv 步骤之后,我在这些列上尝试了ast.literal_eval,以便将 str 格式的字典转换为字典类型的对象。但是,我不断收到malformed node or string 错误。

以下是相关字典的典型示例:1: 3681.45, 0: 3693.3333333333335。另一个,nan 值:1: 4959.95652173913, 0: nan。编辑:实际上,只有这个nan 值导致了错误(请参阅下面的Rakesh 解决方案)。

查看以前的答案,出现此错误的一个原因可能是因为这些列中的大多数 dicts 值都是浮点数,显然literal_eval 无法处理浮点数或 nans,即使它们被包含在内在字典中(尽管这是我从一个关于元组的问题中推断出来的)。

我必须阅读很多问题和答案才能获得这么多信息,所以认为用关键字strdict 和标题中的nan 开始一个新主题可能会很有用.

非常感谢任何帮助!

【问题讨论】:

@Rakesh 当然,我已经添加了一个典型示例,还有一个具有 nan 值的示例,这可能会带来额外的麻烦。 【参考方案1】:

在具有nan的json上使用eval

例如:

import ast
from numpy import nan

print(ast.literal_eval("1: 3681.45, 0: 3693.3333333333335"))
print(eval("1: 4959.95652173913, 0: nan"))

df = pd.DataFrame("A": ["1: 4959.95652173913, 0: nan", "1: 4959.95652173913, 0: nan"])
df['B'] = df["A"].apply(lambda x: eval(x))
print(df)

输出:

                               A                              B
0  1: 4959.95652173913, 0: nan  1: 4959.95652173913, 0: nan
1  1: 4959.95652173913, 0: nan  1: 4959.95652173913, 0: nan

【讨论】:

非常感谢拉克什。我刚刚发现只有“nan”值导致错误,所以我要更新我的问题。一个小补充问题;在围绕这个主题的其他主题中,人们谈论了很多关于仅在您有可信数据输入的情况下使用 eval 的问题。这仍然是一个需要牢记的考虑因素吗? 另外,你没有引起注意,但我发现 nan 的简单直接导入非常优雅,可以绕过字典中它不是 np.nan 的事实!再次感谢您。 一个小问题仍然存在:这适用于转换单个实例,但不适用于转换列: df['Examples'] = df['Examples'].apply(eval) 这仍然返回," NameError: name 'nan' is not defined" 在应用中使用lambda 好的,谢谢一百万,这行得通!我不完全明白为什么会这样,但我想我可以自己研究一下。

以上是关于将具有 nan 值的 str 类型字典转换为字典类型对象的主要内容,如果未能解决你的问题,请参考以下文章

将数据框转换为具有多个值的字典

python pandas将数据框转换为具有多个值的字典

Pandas:如何将具有重复索引值的数据框转换为字典

Python将列表转换为具有多个键值的字典[关闭]

为啥字典键被转换为继承的类类型?

如何将给定的 Excel 文件转换为 Python 中的字典?