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

Pandas如何将列名字符串拆分为多级索引并计算同维度产品价差

解决方案

第一步:宽表转长格式

最符合Pandas规范的实现方式是先将列名拆分转为多层索引,再通过stack方法直接转换为长表,全程无需手动遍历处理列名,代码简洁且性能优异:

import pandas as pd

# 拆分列名,生成【产品编码、合约日期】两层列索引
df.columns = df.columns.str.split('.', expand=True)
df.columns.names = ['Group', 'Date']

# 转长表,dropna=False保留NaN值,符合示例输出要求
long_df = df.stack(level=['Group', 'Date'], dropna=False)

# 如果需要转为平表格式,执行下面的重置索引代码即可
# long_df = long_df.reset_index(name='Value')

执行后得到的long_df就完全符合你给出的长格式输出结构,自带VALUE_TIME、Group、Date三级行索引。

第二步:计算任意产品组合价差

按VALUE_TIME和Date分组后批量计算两两产品的差值即可,用itertools.combinations生成不重复的产品对,避免重复计算:

import itertools

# 先转为透视表结构,方便批量做差
pivot_df = long_df.unstack(level='Group')['Value']

# 生成所有不重复的两两产品组合,如需同时保留A-B和B-A,替换为itertools.permutations即可
product_pairs = list(itertools.combinations(pivot_df.columns.tolist(), 2))

spread_result = []
for prod1, prod2 in product_pairs:
    # 计算价差,添加组合标识
    temp = (pivot_df[prod1] - pivot_df[prod2]).reset_index(name='Value')
    temp['Spread'] = f'{prod1}-{prod2}'
    spread_result.append(temp)

# 合并结果并调整索引格式
spread_df = pd.concat(spread_result, ignore_index=True).set_index(['VALUE_TIME', 'Spread', 'Date']).sort_index()

最终得到的spread_df就是你需要的价差结构,直接输出即可查看多级索引的展示效果。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 07:45:03