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

如何基于Pandas MultiIndex计算百分比变化列?

基于Pandas MultiIndex计算组内百分比变化列

解决步骤

要实现按MultiIndex上层分组计算百分比变化,核心是先统一数据类型,再按组执行差值与基准值的比值计算:

  1. 转换数值类型:原DataFrame的A列是字符串格式,需转为数值型才能进行运算:
df1['A'] = pd.to_numeric(df1['A'])
  1. 按组计算百分比变化:以MultiIndex的第一层(first/second)为分组依据,每组内以第一个值为基准,计算后续值相对基准的变化率,组内第一个值的变化率设为0:
df1['%'] = df1.groupby(level=0)['A'].apply(lambda x: (x - x.iloc[0]) / x.iloc[0])
  1. 格式调整(可选):如果需要和示例结果的格式一致(比如小数显示为.5而非0.5),可以转换为字符串并处理:
df1['%'] = df1['%'].apply(lambda x: f"{x:.1f}".lstrip('0') if x != 0 else '0')

完整代码

import pandas as pd
import numpy as np

row_x1 = ['1','0']
row_x2 = ['1.5','.5']
row_x3 = ['3','1']
row_x4 = ['2','0']
row_x5 = ['3','.5']

index_arrays = [
    np.array(['first', 'first', 'first', 'second', 'second']),
    np.array(['one','two','three','one','two'])
]

df1 = pd.DataFrame(
    [row_x1,row_x2,row_x3,row_x4,row_x5],
    columns=['A'],
    index=index_arrays,
)

# 转换数值类型
df1['A'] = pd.to_numeric(df1['A'])
# 计算百分比变化列
df1['%'] = df1.groupby(level=0)['A'].apply(lambda x: (x - x.iloc[0]) / x.iloc[0])
# 调整显示格式匹配示例
df1['%'] = df1['%'].apply(lambda x: f"{x:.1f}".lstrip('0') if x != 0 else '0')

print(df1)

运行结果

A   %
first  one      1   0
       two    1.5  .5
       three    3   1.0
second one      2   0
       two      3  .5

注:如果不需要保留1.0的小数位,可添加逻辑将整数型结果转为整数字符串。

大数据集适配

groupby是Pandas原生优化的分组运算接口,处理大规模数据集时性能稳定,无需手动循环,适合程序化批量处理。

内容的提问来源于stack exchange,提问作者numb from pie

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.11 21:01:00