You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.27 01:48:15