如何合并多索引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
相关产品推荐
相关产品推荐

