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

如何优雅实现DataFrame日期列转置为行?求代码优化方案

问题描述

我有一份存储在Excel文件中的行情数据,包含541家公司的信息,数据结构如下:

ticker  company sector  industryGroup   industry    subindustry currency    1999-07-31  1999-10-31  2000-01-31  ...
CompA   Health  Health  Health      Health      Health      USD     12.3        23.33       33.1        ...
CompB   Machine Machine Machine     Machine     Machine     USD     32.1        34.44       23.1        ...                                                             
CompC   Machine Machine Machine     Machine     Machine     USD     32.1        34.44       23.1        ...
CompD   Machine Machine Machine     Machine     Machine     USD     32.1        34.44       23.1        ...

日期列从1999-07-31一直延伸至2024-01-02。我需要将数据转换为以下格式:

Date        CompA    CompB    CompC    CompD
1999-07-31  12.3     32.1     32.1     32.1
1999-10-31  23.33    34.44    34.44    34.44
2000-01-31  33.1     34.44    34.44    34.44

目前我编写了如下代码实现该需求:

import pandas as pd

bvmf = pd.read_excel('Market.xlsx')

df = pd.DataFrame()
df['Date'] = bvmf.iloc[0:1, 10:].columns

for i in range(len(bvmf)):
    ticker = bvmf['ticker'][i]
    df[ticker] = bvmf.iloc[i:i+1, 10:].values[0]

由于数据量较大,请问是否有更优的实现方式?

更高效的实现方式

你可以利用Pandas的内置向量化操作替代循环,大幅提升处理效率,代码如下:

import pandas as pd

# 读取Excel数据
bvmf = pd.read_excel('Market.xlsx')

# 1. 将ticker设为索引,筛选出日期列(对应原代码中的第10列及之后)
# 2. 转置数据,让日期成为行索引
# 3. 重置索引并将原索引重命名为Date
df = bvmf.set_index('ticker').iloc[:, 10:].T.reset_index()
df.rename(columns={'index': 'Date'}, inplace=True)

优化原因:

  • 避免循环开销:原代码通过for循环逐行处理541家公司,Pandas的循环操作在数据量大时效率极低,而内置的set_index、iloc、T(转置)都是基于底层优化的向量化操作,处理速度快得多。
  • 代码更简洁:只用一行核心代码完成转换,可读性和维护性更强。
  • 自动处理列名:转置后直接将ticker作为列名,无需手动循环赋值。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.23 01:50:18