如何优雅实现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
相关产品推荐
相关产品推荐

