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

Pandas如何不使用循环实现宽DataFrame列转置/转换为行结构

宽格式股票表无循环转长格式实现方案

你需要的操作是典型的宽表转长表重塑,不需要写循环,pandas原生的向量化接口pd.wide_to_long就是专门适配这种「列名由指标_标识格式组成」的场景,性能比逐股票循环拼接高数十到上百倍。

实现代码

直接调用接口即可,输出结构和你循环得到的结果完全一致:

# 核心转换逻辑,全程无Python层循环
agg_df = pd.wide_to_long(
    df,
    stubnames=["price", "volume"], # 固定的指标前缀,对应列名里下划线前的部分
    i="date", # 不需要拆分的固定标识列
    j="stock", # 从列名后缀拆分出的股票代码列名
    sep="_", # 指标和股票代码的分隔符
    suffix=".*" # 适配所有股票代码命名,包括你列表里开头带空格的" MSFT"这类异常值
).reset_index(drop=False)

# 可选:如果需要和你原循环的输出顺序完全一致(按股票、日期排序),加一行排序即可
agg_df = agg_df.sort_values(by=["stock", "date"]).reset_index(drop=True)

性能说明

你原来的循环写法效率低的核心原因是:

  • 循环内反复调用DataFrame.append(),每次执行都会全量复制一次已拼接的DataFrame,随着股票数量增加,耗时会呈非线性上涨
  • 所有操作都是Python层循环,没有用到pandas底层的C/NumPy向量化优化

pd.wide_to_long是底层实现的向量化操作,全程没有逐组遍历、逐次复制的开销,哪怕你有上千只股票、十万级别的日期行,也能在毫秒级完成转换。

注意事项

转换前建议先检查列名拼写,比如你给的样例里列名写的是price_AAPLE(多了一个E),但股票列表里是AAPL,这类拼写不一致会导致对应列匹配失败,提前统一命名即可。


内容的提问来源于stack exchange,提问作者FlyUFalcon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.30 05:09:20