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

如何将多级索引DataFrame转为层级列并添加delta计算列?

问题描述

现有如下多级索引的DataFrame:

df:
                       open   close 
date         Symbol
2022-01-01   SPY       100    102
             TSLA      232    245
2022-01-02   SPY       103    100
             TSLA      222    220
             AAPL      143    147

需将其转换为带层级列的DataFrame,并添加delta列(计算公式:delta = open - close),最终期望得到的结构如下:

df:
           SPY                 TSLA                AAPL
           Open  Close  delta  Open  Close  delta  Open  Close  delta
date
2022-01-01 100   102    -2     232   245    -13    nan   nan    nan
2022-01-02 103   100     3     222   220      2    143   147     -4

此前尝试使用pivot方法未成功,求可行实现方案。

实现方案

可以通过unstack展开索引、计算差值、合并列并调整层级的方式实现,以下是两种高效的实现方式:

方式一:简洁版(推荐)

利用pd.concat合并原始数据和计算后的delta列,避免循环操作:

import pandas as pd

# 假设原始多级索引DataFrame已存在
# 1. 将Symbol行索引转为列层级
df_unstacked = df.unstack(level='Symbol')

# 2. 计算每个Symbol的delta值,构造新的DataFrame
delta_df = (df_unstacked['open'] - df_unstacked['close']).rename('delta', level=0)

# 3. 合并原始数据(重命名列匹配目标格式)和delta列
combined_df = pd.concat([
    df_unstacked.rename({'open': 'Open', 'close': 'Close'}, level=0),
    delta_df
], axis=1)

# 4. 交换列层级顺序,将Symbol放在外层,指标(Open/Close/delta)放在内层,并排序
final_df = combined_df.swaplevel(axis=1).sort_index(axis=1)

print(final_df)

方式二:分步清晰版

如果需要更清晰的分步逻辑,可以按以下步骤操作:

import pandas as pd

# 1. 展开Symbol索引为列层级
df_unstacked = df.unstack(level='Symbol')

# 2. 重命名内层列名,匹配目标格式的首字母大写
df_unstacked.columns = df_unstacked.columns.set_levels(['Open', 'Close'], level=0)

# 3. 遍历每个Symbol,计算并添加delta列
for symbol in df_unstacked.columns.get_level_values(1).unique():
    df_unstacked[('delta', symbol)] = df_unstacked[('Open', symbol)] - df_unstacked[('Close', symbol)]

# 4. 交换列层级并排序,确保每个Symbol下的列顺序为Open/Close/delta
final_df = df_unstacked.swaplevel(axis=1).sort_index(axis=1)

# 可选:统一内层列名的格式(确保delta为小写)
final_df.columns = final_df.columns.set_levels(['Open', 'Close', 'delta'], level=1)

print(final_df)

关键逻辑说明

  • unstack(level='Symbol'):将行索引中的Symbol维度转换为列的外层索引,是实现行列转换的核心操作。
  • swaplevel(axis=1):交换列的两个层级,将Symbol移到外层,指标(Open/Close/delta)移到内层,匹配目标结构。
  • sort_index(axis=1):对列进行排序,确保每个Symbol下的指标按Open→Close→delta的顺序排列。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 06:40:21