Pandas:将字符串列表中的nan转为None后literal_eval再转回np.nan
解决literal_eval无法识别字符串中nan的问题
下面是两种实用的处理方法,核心思路就是先把字符串里的nan替换成literal_eval能识别的None,解析后再转回np.nan:
方法一:简单字符串替换+列表推导
适合确定字符串里的nan都是单独出现的场景,步骤直接清晰:
import ast import numpy as np import pandas as pd # 构造示例DataFrame df = pd.DataFrame({'float_list': ['[1.21, 1.21, nan, nan, 100]', '[3.4, nan, 5.6, 7.8]']}) def parse_str_list(s): # 把字符串里的nan替换成None processed_str = s.replace('nan', 'None') # 用literal_eval解析成列表 raw_list = ast.literal_eval(processed_str) # 把列表里的None转成np.nan return [np.nan if item is None else item for item in raw_list] # 应用到目标列 df['parsed_list'] = df['float_list'].apply(parse_str_list)
方法二:正则替换(更严谨)
如果字符串里可能存在包含nan的其他子串(比如nan_value),用正则匹配独立的nan单词,避免误替换:
import re import ast import numpy as np import pandas as pd df = pd.DataFrame({'float_list': ['[1.21, nan, nan_value, 100]', '[3.4, nan, 5.6]']}) def parse_str_list(s): # 匹配独立的nan(前后是单词边界),替换为None processed_str = re.sub(r'\bnan\b', 'None', s) raw_list = ast.literal_eval(processed_str) return [np.nan if item is None else item for item in raw_list] df['parsed_list'] = df['float_list'].apply(parse_str_list)
这两种方法都能高效完成转换,其中正则替换的通用性更强,适合复杂场景。
内容的提问来源于stack exchange,提问作者apk19
相关产品推荐
相关产品推荐

