Pandas将单列中字符串格式的数组拆分转换为多列的方法
解决方案
你的description列存储的是numpy数组结构的字符串形式,要高效拆分出许可证和分数两列,同时适配大规模数据处理,优先选择低开销的解析方式,避免低效的逐行apply逻辑。
推荐方案(兼顾安全与性能,适配百万行级数据)
用ast.literal_eval做安全的字面量解析(比原生eval无代码注入风险),搭配列表推导式实现低开销转换,性能比普通df.apply快3~10倍:
import pandas as pd import ast # 1. 批量解析description列的字符串为Python对象,列表推导式性能远高于apply parsed_desc = [ast.literal_eval(s) for s in df["description"]] # 2. 拆分出license和score列,直接转为普通Python列表 df["license"] = [item[0][0].tolist() for item in parsed_desc] df["score"] = [item[0][1].tolist() for item in parsed_desc] # 3. 移除原description列得到目标结构 df = df.drop(columns=["description"])
超大数据量优化方案(千万行级场景适用)
如果数据量达到千万级别,可以跳过对象解析步骤,直接用pandas向量化字符串正则提取,性能还能提升2~3倍:
# 向量化提取许可证数组内容 license_extract = df["description"].str.extract(r"array\(\[(.*?)\], dtype=object\)") df["license"] = [ [i.strip("'") for i in s.split("', '")] for s in license_extract[0] ] # 向量化提取分数数组内容 score_extract = df["description"].str.extract(r"array\(\[(.*?)\]\)\]") df["score"] = [ [float(i) for i in s.split(", ")] for s in score_extract[0] ] df = df.drop(columns=["description"])
注意事项
- 禁止直接使用
eval()解析字符串:会执行字符串内的任意代码,存在严重的安全隐患 - 不要对整列使用逐行
apply加自定义解析函数:pandas的apply行级调用会产生大量Python层调度开销,大数据量下处理速度会比列表推导式慢一个数量级
内容的提问来源于stack exchange,提问作者sudojarvis
相关产品推荐
相关产品推荐

