如何从DataFrame数组与符号数组构建指定结构的MultiIndex DataFrame
合并多资产DataFrame为MultiIndex结构的实现方案
刚好我之前处理过类似的需求,给你分享两种最常用的实现方式,根据你的原始数据结构来选:
场景1:你有多个单资产的DataFrame列表
假设你已经把每个资产的行情数据存在一个列表里(比如df_list = [symbol1_df, symbol2_df]),同时有对应的资产符号列表symbols = ["symbol1", "symbol2"],每个单资产DataFrame的索引都是DatetimeIndex,列是open/high/low/close/volume这些指标。
直接用pd.concat就能一步到位生成目标结构:
import pandas as pd # 核心代码:按列合并,用keys参数指定资产层级 multi_index_df = pd.concat( df_list, keys=symbols, axis=1 )
- 生成的结果里,列索引是双层MultiIndex:第一层是资产符号,第二层是行情指标
- 行索引保留原来的DatetimeIndex,自动对齐所有时间点(缺失的时间点会填充
NaN,如果要只保留所有资产都有的时间点,加个join='inner'参数即可)
小示例验证
我给你写个可运行的小例子,你可以直接测试:
# 创建模拟数据 dates = pd.date_range('2022-06-17', periods=3, tz='UTC') symbol1_df = pd.DataFrame( {'open': [271.0, 272.0, 273.0], 'high': [276.62, 277.0, 278.0], 'low': [270.39, 271.0, 272.0], 'close': [270.73, 271.5, 272.2], 'volume': [10947530, 11000000, 10800000]}, index=dates ) symbol2_df = pd.DataFrame( {'open': [150.0, 151.0, 152.0], 'high': [155.0, 156.0, 157.0], 'low': [149.0, 150.0, 151.0], 'close': [152.0, 153.0, 154.0], 'volume': [5000000, 5100000, 5200000]}, index=dates ) # 合并 df_list = [symbol1_df, symbol2_df] symbols = ["symbol1", "symbol2"] multi_index_df = pd.concat(df_list, keys=symbols, axis=1) # 查看列结构 print(multi_index_df.columns)
输出的列索引就是你要的结构:
MultiIndex([('symbol1', 'open'), ('symbol1', 'high'), ('symbol1', 'low'), ('symbol1', 'close'), ('symbol1', 'volume'), ('symbol2', 'open'), ('symbol2', 'high'), ('symbol2', 'low'), ('symbol2', 'close'), ('symbol2', 'volume')], )
场景2:你有一个包含所有资产数据的单一DataFrame
如果你的原始数据是把所有资产数据存在一个大df里,多了一列symbol用来标记资产,那可以用set_index+unstack的方式转换:
# 假设raw_df是包含symbol列的大DataFrame multi_index_df = raw_df.set_index(['timestamp', 'symbol']).unstack('symbol') # 调整层级顺序,把资产放在第一层,指标放在第二层 multi_index_df = multi_index_df.swaplevel(axis=1).sort_index(axis=1)
这样同样能得到和场景1一致的MultiIndex结构。
额外提示
- 如果需要调整指标的顺序,比如把
close放在最前面,可以用reindex指定列顺序 - 如果要筛选某个资产的所有指标,可以用
multi_index_df['symbol1']直接获取;筛选所有资产的收盘价可以用multi_index_df.xs('close', axis=1, level=1)
内容的提问来源于stack exchange,提问作者Ferdinand Loesch
相关产品推荐
相关产品推荐

