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

多级索引DataFrame新增计算列:按指定公式生成目标df2的实现方法

基于Pandas实现多级索引DataFrame的指标计算方案

步骤1:实现数值清洗函数

原始数据的数值包含$、千分位逗号、括号(代表负数)、横线(代表0值),需要先统一转换为可计算的数值类型:

import pandas as pd
import re

def clean_num(val):
    # 横线替换为0
    if val == '-':
        return 0
    val_str = str(val).strip()
    # 移除$符号和千分位逗号
    val_str = val_str.replace('$','').replace(',','')
    # 处理括号格式的负数,比如(2160)转换为-2160
    match = re.match(r'\((\d+)\)', val_str)
    if match:
        return -int(match.group(1))
    # 普通数值直接转换
    return int(val_str)

步骤2:清洗原始DataFrame的数值列

原始df_1为多级列索引,前3列为普通维度列(date、sku、supplier),后续为两级索引的指标列:

# 对所有指标列应用清洗函数
for col in df_1.columns[3:]:
    df_1[col] = df_1[col].apply(clean_num)

步骤3:按公式计算生成目标df_2

通过多级列的元组标识访问对应列完成计算:

df_2 = pd.DataFrame()
# 复制基础维度列
df_2[['date','sku','supplier']] = df_1[['date','sku','supplier']]
# 按给定公式计算新列
df_2['a'] = df_1[('a','a3')]
df_2['b6'] = df_1[('b','b3')]
df_2['b7'] = df_1[('b','b4')] - df_1[('b','b1')]
df_2['b8'] = (df_1[('b','b2')] + df_1[('b','b5')]).abs()

步骤4(可选):还原为原始展示格式

如果需要输出和示例一致的带$、千分符、括号负数的展示效果,可以新增格式化函数转换数值:

def format_num(val, add_dollar=True):
    abs_val = abs(val)
    # 增加千分位分隔符
    num_str = f"{abs_val:,}"
    # 负数用括号包裹
    if val < 0:
        num_str = f"({num_str})"
    # 货币类列增加$前缀
    if add_dollar:
        num_str = f"${num_str}"
    return num_str

# 应用格式到对应列
df_2['a'] = df_2['a'].apply(lambda x: format_num(x, add_dollar=False))
for col in ['b6','b7','b8']:
    df_2[col] = df_2[col].apply(format_num)

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.02 21:00:07