使用Python动态实现多列股票数据列转行(宽表转长表)
Python环境下股票宽表转长表实现方案
核心使用pandas库的melt方法实现,无需手动枚举所有股票列名,可自动识别除日期列外的全部股票列完成转换,适配6000+股票列的处理场景。
实现步骤
前置依赖准备
先确保环境安装了pandas,导入依赖:import pandas as pd读取你的原始数据表,根据文件格式选择对应读取方法:
# 读取csv格式文件 df = pd.read_csv("你的股票数据文件路径.csv") # 如果是excel文件,替换为pd.read_excel("你的股票数据文件路径.xlsx")核心宽转长逻辑
调用melt方法,仅指定需要保留的Date列,其余所有列自动识别为股票列做行转换:long_df = pd.melt( df, id_vars=["Date"], # 保留不做转换的列,即原始日期列 var_name="Stock", # 转换后存储股票名称的列名 value_name="Price" # 转换后存储价格数值的列名 )按规则排序
按照需求,先按股票名称分组,组内按日期升序排列:# 可选:如果Date列是字符串格式,先转成标准日期格式保证排序准确 long_df["Date"] = pd.to_datetime(long_df["Date"]) # 排序后重置索引 long_df = long_df.sort_values( by=["Stock", "Date"], ascending=[True, True] ).reset_index(drop=True)可选优化
如果需要剔除个股无价格的空记录,可以追加去空逻辑:long_df = long_df.dropna(subset=["Price"])
之前方法失效原因说明
transpose()为全表行列转置,会把原始日期列也转换为行/列维度,无法保留日期列的独立结构,不符合需求- 原生
stack()方法默认会堆叠所有列,需要提前将Date列设置为索引才能得到近似结果,配置繁琐易出错,对动态列场景适配性差
效果验证
原始宽表样例结构:
Date Stock1 Stock2 Stock3 2024-01-02 10.2 23.5 8.7 2024-01-03 10.5 23.1 8.9
转换后长表输出结构:
| Date | Stock | Price |
|---|---|---|
| 2024-01-02 | Stock1 | 10.2 |
| 2024-01-03 | Stock1 | 10.5 |
| 2024-01-02 | Stock2 | 23.5 |
| 2024-01-03 | Stock2 | 23.1 |
| 2024-01-02 | Stock3 | 8.7 |
| 2024-01-03 | Stock3 | 8.9 |
内容的提问来源于stack exchange,提问作者feyadej
相关产品推荐
相关产品推荐

