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

如何合并多索引DataFrame以生成按日期分组的股票横截面?

合并多索引DataFrame生成按日期分组的股票横截面

直接解决方案:concat + 索引排序

你需要的结构可以通过纵向拼接两个DataFrame后,对多索引排序直接实现,这是最简洁的方式:

import pandas as pd
import numpy as np

# 生成原始数据(你的代码)
dates = pd.date_range(start='2020-01-01', periods = 5)
stock_id_msft = ['MSFT']*5
stock_id_aapl = ['AAPL']*5

index = pd.MultiIndex.from_tuples(list(zip(*[dates, stock_id_msft])), 
                                  names = ['date', 'stock_id'])
df_msft = pd.DataFrame(index = index,
                       data  = np.random.rand(5)*10,
                       columns = ['price'])

index = pd.MultiIndex.from_tuples(list(zip(*[dates, stock_id_aapl])), 
                                  names = ['date', 'stock_id'])
df_aapl = pd.DataFrame(index = index, 
                       data = np.random.rand(5),
                       columns= ['price'])

# 核心合并步骤
df_combined = pd.concat([df_aapl, df_msft]).sort_index(level=['date', 'stock_id'])

结果验证

执行以下代码查看索引结构,完全符合你的要求:

print(df_combined.index.values.tolist())

输出:

[('2020-01-01', 'AAPL'),
 ('2020-01-01', 'MSFT'),
 ('2020-01-02', 'AAPL'),
 ('2020-01-02', 'MSFT'),
 ('2020-01-03', 'AAPL'),
 ('2020-01-03', 'MSFT'),
 ('2020-01-04', 'AAPL'),
 ('2020-01-04', 'MSFT'),
 ('2020-01-05', 'AAPL'),
 ('2020-01-05', 'MSFT')]

关于merge/join的说明

merge和join更适合横向按键匹配列的场景,比如合并不同字段的数据集。如果硬要用它们实现你的需求,需要先将索引转为列,做全外合并后再处理列和索引,步骤繁琐且没必要:

# 不推荐的merge方式(仅作演示)
df_msft_reset = df_msft.reset_index()
df_aapl_reset = df_aapl.reset_index()
# 合并后会生成price_x和price_y,还需额外处理列
df_merged = pd.merge(df_msft_reset, df_aapl_reset, on=['date', 'stock_id'], how='outer')
# 再转回多索引并整理,远不如concat高效

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.09 14:40:37