将具有 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,即使它们被包含在内在字典中(尽管这是我从一个关于元组的问题中推断出来的)。
我必须阅读很多问题和答案才能获得这么多信息,所以认为用关键字str
、dict
和标题中的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 类型字典转换为字典类型对象的主要内容,如果未能解决你的问题,请参考以下文章