Pandas 在 literal_eval 之前将字符串列表中的 nan 值隐藏为 None 并转换回 np.nan

问题描述 投票:0回答:2

我有一个包含几个系列的数据框,其中包含包含 nan 值的浮点数列表。例如

s[0] = '[1.21, 1.21, nan, nan, 100]'

我想使用

literal_eval
将这些字符串转换为列表。当我尝试时出现错误
ValueError: malformed node or string on line 1:
,因为根据文档,
nan
值无法转换,因为无法识别这些值。

将字符串中的

nan
值转换为
None
然后在应用
np.nan
后转换回
literal_eval
值的最佳方法是什么?

python pandas nan abstract-syntax-tree
2个回答
1
投票

解决方案就像问题中描述的那样,但是您得到的是

None
s而不是
NaN
s:

s.str.replace('nan', 'None', regex=True).apply(ast.literal_eval)

如果你需要

np.nan
s使用自定义功能:

def convert(x):
    out = []
    for y in x.strip('[]').split(', '):
        try:   
           out.append(ast.literal_eval(y))
        except:
           out.append(np.nan)
    return out

s.apply(convert)

另一个想法是将所有值转换为浮点数:

f = lambda x: [float(y) for y in x.strip('[]').split(', ')]
s.apply(f)

pd.Series([[float(y) for y in x.strip('[]').split(', ')] for x in s], 
              index=s.index)

0
投票

改编 jezrael 的答案,将一系列列表 nan 转换为 None,使用 literal_eval 转换为列表并返回 nan 的单行代码是:

df['col'] = df['col'].str.replace('nan', 'None', regex=True).apply(ast.literal_eval).apply(lambda row: [np.nan if x is None else x for x in row])
© www.soinside.com 2019 - 2024. All rights reserved.