本文介绍如何使用 Pandas 的 explode() 和 str.split()(适用于合法 Python 列表)或 str.extractall()(适用于 JSON 格式字符串)将含 ["Month:Price", ...] 结构的列快速拆分为多行,生成标准的 id-date-price 长格式表格。
本文介绍如何使用 pandas 的 `explode()` 和 `str.split()`(适用于合法 python 列表)或 `str.extractall()`(适用于 json 格式字符串)将含 `["month:price", ...]` 结构的列快速拆分为多行,生成标准的 `id-date-price` 长格式表格。
在数据分析中,常遇到将宽格式中嵌套的键值对(如 ["March:59", "April:64"])展开为规范长格式的需求。关键在于区分输入数据的真实类型:若 Prices 列是真正的 Python 列表对象(即 list 类型),应优先使用 explode() —— 它专为展开嵌套序列设计,性能高、语义清晰;若该列实际是字符串形式的列表表示(如 '[\"March:59\", \"April:64\"]'),则需借助正则解析。
✅ 方案一:Prices 是真实列表(推荐)
import pandas as pd
df = pd.DataFrame({
'Id': ['001', '002'],
'Prices': [["March:59", "April:64", "May:62"], ["Jan:55"]]
})
# 1. 展开列表 → 每个元素占一行
out = df.explode('Prices')
# 2. 拆分 "Month:Price" 字符串为两列,并移除原列
out[['date', 'price']] = out.pop('Prices').str.split(':', expand=True)
# 3. 可选:转换 price 为数值类型
out['price'] = pd.to_numeric(out['price'])✅ 方案二:Prices 是字符串(需正则提取)
快速生成专业的 Python 脚本和应用代码。一键创建完整项目结构,支持CLI、API、爬虫、Bot、Django等多种项目类型,包含完整的项目结构、配置文件、依赖管理、测试、README和文档。
df = pd.DataFrame({
'Id': ['001', '002'],
'Prices': ['["March:59", "April:64", "May:62"]', '["Jan:55"]']
})
# 使用正则捕获 date 和 price,匹配非引号/冒号字符序列
pattern = r'"(?P<date>[^":]+):(?P<price>[^":]+)"'
out = (df.drop('Prices', axis=1)
.join(df['Prices'].str.extractall(pattern).droplevel('match')))⚠️ 注意事项
立即学习“Python免费学习笔记(深入)”;
- explode() 要求列值必须是可迭代对象(如 list, tuple),若误传字符串会报错;可用 df['Prices'].apply(type) 验证类型。
- 正则方案中,[^":]+ 确保匹配不含引号和冒号的子串,避免跨字段误匹配;若价格含小数点,可改用 r'"(?P<date>[^":]+):(?P<price>[\d.]+)"'。
- 最终结果索引可能重复(如 0,0,0,1),如需唯一索引,添加 .reset_index(drop=True)。
通过合理选择方法,既能避免手动循环或低效 apply(),又能保证代码简洁性与执行效率,是处理此类嵌套结构的标准实践。

















