多级索引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
相关产品推荐
相关产品推荐

