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

如何在MultiIndex DataFrame中比较MA1与其他MA列并生成结果新表

解决MultiIndex DataFrame的MA比较问题

核心思路

利用MultiIndex列的层级提取特性,先单独取出MA1的所有代码数据,再分别与MA2-MA5同代码的数据做差值运算,通过np.sign()直接得到符合要求的1/-1/0结果,最后重新构造目标格式的MultiIndex列。

完整实现代码

import pandas as pd
import numpy as np

# 生成示例MultiIndex DataFrame
index = pd.date_range('2023-01-01', '2023-01-05', freq='D')
codes = ['A', 'B', 'C']
columns = pd.MultiIndex.from_product([['MA1', 'MA2', 'MA3', 'MA4', 'MA5'], codes], names=['MA', 'code'])
data = np.random.randint(1, 10, size=(len(index), len(columns)))
df = pd.DataFrame(data, index=index, columns=columns)

# 提取MA1的所有代码数据
ma1_data = df['MA1']

# 定义需要比较的MA列表
compare_mas = ['MA2', 'MA3', 'MA4', 'MA5']

# 逐个比较并生成结果
result_dfs = []
for ma in compare_mas:
    # 计算MA1与当前MA的差值符号,直接得到1/-1/0
    comp_result = np.sign(ma1_data - df[ma])
    # 修改列名,标记比较关系
    comp_result.columns = pd.MultiIndex.from_product([[f'MA1>{ma}'], codes], names=['MA_compare', 'code'])
    result_dfs.append(comp_result)

# 合并所有结果为最终DataFrame
new_df = pd.concat(result_dfs, axis=1)

# 查看结果
print(new_df)

关键步骤说明

  • 提取MA1数据:df['MA1']直接获取Level0为MA1的所有列,返回的DataFrame列是代码A/B/C,避免了复杂的切片操作,不会触发无效索引错误。
  • 差值符号运算:np.sign()函数会将正数转为1,负数转为-1,0保持为0,完全匹配需求的取值规则,无需额外的条件判断。
  • 构造目标列索引:对每个比较结果的列重新设置MultiIndex,Level0为比较关系名称,Level1保留原代码,最后通过pd.concat按列合并,得到符合要求的new_df。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.05 05:40:24