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

如何从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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 00:37:47