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

Pandas MultiIndex多级索引DataFrame带条件运算的最优实现方法

针对该多层索引DataFrame的批量计算需求,最优的实现方式是使用np.where结合广播操作完成全向量化计算,完全规避Python层循环,性能远高于嵌套循环方案,实现代码如下:

import pandas as pd
import numpy as np

# 示例DataFrame构造
miind = pd.MultiIndex.from_product([['A1','A2'],['B1','B2','B3']])
micol = pd.MultiIndex.from_product([['X1','X2'],['Y1','Y2','Y3']])
df = pd.DataFrame((np.arange(len(miind)*len(micol)) % 5).reshape(len(miind),len(micol)),
    index=miind, columns=micol)

# 核心计算逻辑
idx = pd.IndexSlice
# 提取所有Y3的值,每个X分组的Y3重复2次,匹配同组Y1、Y2的列维度
y3_values = df.loc[:, idx[:, 'Y3']].values.repeat(2, axis=1)
# 生成Y3>0的掩码
valid_mask = y3_values > 0
# 对Y1、Y2列做条件除法,Y3<=0时保留原值
df.loc[:, idx[:, ['Y1', 'Y2']]] = np.where(
    valid_mask,
    df.loc[:, idx[:, ['Y1', 'Y2']]] / y3_values,
    df.loc[:, idx[:, ['Y1', 'Y2']]]
)

print(df.round(6))

运行后输出结果和嵌套循环得到的结果完全一致:

X1                     X2             
             Y1        Y2 Y3        Y1        Y2 Y3
A1 B1  0.000000  0.500000  2  3.000000  4.000000  0
   B2  0.333333  0.666667  3  4.000000  0.000000  1
   B3  0.500000  0.750000  4  0.000000  0.500000  2
A2 B1  3.000000  4.000000  0  0.333333  0.666667  3
   B2  4.000000  0.000000  1  0.500000  0.750000  4
   B3  0.000000  0.500000  2  3.000000  4.000000  0

该方案所有计算都在numpy底层完成,没有Python层的遍历开销,处理十万行以上的大表时,性能是嵌套循环的数百到数千倍。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 14:54:11