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
相关产品推荐
相关产品推荐

