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
相关产品推荐
相关产品推荐

