我有一个包含几个系列的数据框,其中包含包含 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
值的最佳方法是什么?
解决方案就像问题中描述的那样,但是您得到的是
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)
改编 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])