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

如何重组DataFrame序列,交换索引与帧顺序生成目标结构DataFrame

问题描述

我有48个月度股票收益时序DataFrame(尺寸为169×137),通过字典mom引用,比如mom[1]代表第一个时序DataFrame,其中行对应时间、列对应股票。

需求是:为每个时间点生成一个新DataFrame——新DataFrame的行是股票,列是48个原DataFrame在该时间点的对应数值,最终得到169个独立的137×48的DataFrame,每个对应一个时间点。

目前已写出生成第一个时间点DataFrame的代码,但不知道如何扩展到全部时间点:

date = mom[1].axes[0]
date = date[0].date()

set = mom[1].iloc[[0]].transpose()
set.columns = ['mom1']
set = set.rename_axis(date,axis=0)
set = set.rename_axis('Ticker',axis=1)
解决方案

直接循环每个时间点的索引,同时遍历48个原DataFrame提取对应行,拼接后整理格式即可:

步骤说明

  1. 统一获取所有时间点的索引(假设所有mom字典里的DataFrame时间轴一致,从任意一个取即可)
  2. 循环每个时间点索引,对每个时间点:
    • 遍历48个原DataFrame,提取该时间点的行并转置
    • 把这些转置后的Series拼接成一个新DataFrame
    • 设置列名为mom1到mom48,调整索引和轴名称

完整代码

import pandas as pd

# 获取所有时间点的索引
all_dates = mom[1].index

# 用字典存储生成的169个DataFrame,键为日期
result_dfs = {}

# 循环每个时间点
for idx, dt in enumerate(all_dates):
    # 初始化空DataFrame
    combined = pd.DataFrame()
    # 遍历48个原DataFrame
    for i in range(1, 49):
        # 提取当前时间点的行,转置后重命名列
        temp_df = mom[i].iloc[idx].to_frame(name=f'mom{i}')
        # 拼接列
        combined = pd.concat([combined, temp_df], axis=1)
    # 设置轴名称
    combined = combined.rename_axis('Ticker', axis=0)
    combined = combined.rename_axis(dt.date(), axis=1)
    # 存入结果字典
    result_dfs[dt.date()] = combined

# 示例:取第一个时间点的结果
first_result = result_dfs[all_dates[0].date()]

优化提示

如果原DataFrame数量多,循环拼接效率低,可以改用列表推导式先收集所有Series再一次性拼接:

import pandas as pd

all_dates = mom[1].index
result_dfs = {}

for idx, dt in enumerate(all_dates):
    # 收集所有时间点的Series
    series_list = [mom[i].iloc[idx].rename(f'mom{i}') for i in range(1, 49)]
    # 一次性拼接成DataFrame
    combined = pd.concat(series_list, axis=1)
    combined = combined.rename_axis('Ticker', axis=0)
    combined = combined.rename_axis(dt.date(), axis=1)
    result_dfs[dt.date()] = combined

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.30 20:08:31