如何将包含混合值且字符串无引号的列表字符串转换为实际列表?
无引号混合类型列表格式字符串转换方案
你可以通过以下两种常用方案实现转换,均不需要修改原始数据源:
方案1:正则预处理后安全解析
适合元素顺序不固定、字符串内容规则可预测的场景,使用正则匹配未加引号的字符串元素补全引号后,调用ast.literal_eval完成解析,安全性高于直接使用eval:
import pandas as pd import re import ast # 构造示例DataFrame df = pd.DataFrame({'col_1': ['[2, A]', '[5, BC]']}) def parse_list_str(s): # 匹配所有字母开头的标识符,补双引号 quoted_str = re.sub(r'([a-zA-Z_][a-zA-Z0-9_]*)', r'"\1"', s) # 安全解析为列表 return ast.literal_eval(quoted_str) # 应用转换 df['col_1'] = df['col_1'].apply(parse_list_str) # 测试输出 print(df.loc[0, 'col_1']) # 输出 [2, 'A'] print(type(df.loc[0, 'col_1'])) # 输出 <class 'list'>
方案2:手动拆分识别元素类型
适合格式规则简单、不想引入正则匹配的场景,直接去除括号拆分元素后,逐个判断类型赋值:
def parse_simple_list(s): # 去除首尾括号,拆分所有元素 elements = [e.strip() for e in s.strip('[]').split(',')] res = [] for ele in elements: # 尝试转整型,失败则保留为字符串 try: res.append(int(ele)) except ValueError: res.append(ele) return res # 应用转换 df['col_1'] = df['col_1'].apply(parse_simple_list)
该方案对元素顺序没有要求,即使列表内字符串在前、数值在后也可以正常解析。
内容的提问来源于stack exchange,提问作者Mark P
相关产品推荐
相关产品推荐

