商城首页欢迎来到中国正版软件门户

您的位置: 首页 > 文章列表 > 编程开发 > Python 中将嵌套日期-价格字符串列表高效展开为长格式数据表

Python 中将嵌套日期-价格字符串列表高效展开为长格式数据表

  发布于2026-07-02 阅读(0)

扫一扫,手机访问

在日常数据分析中,我们经常会遇到这样一种情况:明明数据已经整理好了,但偏偏有一列数据是嵌套的“键值对”列表,比如 ["March:59", "April:64"] 这种格式。想要把它拆成标准的 id-date-price 长格式表,手动循环太慢,用 apply 又不够优雅。其实,Pandas 里已经内置了非常高效的方案,关键就看你这列数据到底是“真正的 Python 列表”还是“长得像列表的字符串”。

Python 中将嵌套日期-价格字符串列表高效展开为长格式数据表

先说说最常见的场景:如果 Prices 列在 DataFrame 里是 list 类型(比如你从 JSON 直接解析出来的),那直接用 explode() 是最省事的。它天生就是为展开嵌套序列设计的,性能高,代码也干净。

方案一: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'])

这段代码跑完,原本每行一条记录就变成了每行一个日期-价格对,干净利落。

不过,现实往往没那么理想。很多时候你从 CSV 或数据库里拿到的数据,这个 Prices 列其实是一个字符串,比如 '["March:59", "April:64", "May:62"]'。这时候 explode() 会直接报错——因为它期待的是可迭代对象,而不是字符串。那怎么办?别急,用正则提取就好了。

方案二:Prices 是字符串(需正则提取)

df = pd.DataFrame({
    'Id': ['001', '002'],
    'Prices': ['["March:59", "April:64", "May:62"]', '["Jan:55"]']
})

# 使用正则捕获 date 和 price,匹配非引号/冒号字符序列
pattern = r'"(?P[^":]+):(?P[^":]+)"'
out = (df.drop('Prices', axis=1)
         .join(df['Prices'].str.extractall(pattern).droplevel('match')))

这里的关键是正则表达式 [^":]+,确保只匹配不含引号和冒号的子串,避免跨字段误匹配。如果价格带小数点,比如 "April:64.5",把 price 那部分改成 [\d.]+ 就行。

⚠️ 注意事项

  • explode() 之前,建议先用 df['Prices'].apply(type) 确认一下列的类型——传错类型会直接报错,排查起来挺耽误时间的。
  • 正则方案提取后,索引会重复(比如 0,0,0,1),如果后续需要唯一索引,记得加一句 .reset_index(drop=True)
  • 最终结果里,dateprice 列已经是拆分好的,可以直接用于后续分析或可视化。

两种方法覆盖了绝大多数实际场景,既避免了手动循环的低效,也绕开了 apply 的繁琐。说到底,处理这种嵌套结构,选对工具比写复杂逻辑更重要——毕竟,数据分析师的时间应该花在思考业务上,而不是跟字符串死磕。

本文转载于:https://www.php.cn/faq/2464937.html 如有侵犯,请联系zhengruancom@outlook.com删除。
免责声明:正软商城发布此文仅为传递信息,不代表正软商城认同其观点或证实其描述。

热门关注