如何重组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提取对应行,拼接后整理格式即可:
步骤说明
- 统一获取所有时间点的索引(假设所有
mom字典里的DataFrame时间轴一致,从任意一个取即可) - 循环每个时间点索引,对每个时间点:
- 遍历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
相关产品推荐
相关产品推荐

