Pandas读取含列表的CSV列被识别为字符串的解决方法
将字符串形式的列表转换为真实列表列的高效方法
以下是几种可靠且高效的实现方式,按推荐程度排序:
方法1:使用ast.literal_eval(最安全高效)
ast.literal_eval专门用于解析字符串形式的Python字面量(列表、字典等),比原生eval更安全,不会执行恶意代码,处理这类场景最稳妥。
示例代码:
import ast import pandas as pd # 假设df是你的DataFrame df['ColName2007'] = df['ColName2007'].apply(ast.literal_eval)
如果数据量极大,还可以用批量处理方式加速:
import numpy as np df['ColName2007'] = np.vectorize(ast.literal_eval)(df['ColName2007'])
或者借助swifter自动选择最优执行方式:
import swifter df['ColName2007'] = df['ColName2007'].swifter.apply(ast.literal_eval)
方法2:字符串分割(适合格式严格的场景)
如果你的字符串格式完全规整(固定为['xxx', 'yyy']形式),可以通过字符串替换和分割实现,速度比ast.literal_eval更快,但容错性差,格式稍有变化就会出错。
示例代码:
df['ColName2007'] = df['ColName2007'].str.strip('[]') \ .str.replace("'", "") \ .str.split(', ')
注意:若列表元素包含逗号或单引号,此方法会失效,仅适合格式完全统一的情况。
方法3:正则表达式提取
用正则匹配所有被单引号包裹的内容,提取列表元素,容错性比字符串分割稍好,但依然不如ast.literal_eval通用。
示例代码:
import re def extract_list(s): return re.findall(r"'(.*?)'", s) df['ColName2007'] = df['ColName2007'].apply(extract_list)
该方法能适配部分格式小变动(如空格差异),但元素本身包含单引号时会出错。
内容的提问来源于stack exchange,提问作者324
相关产品推荐
相关产品推荐

