Multi-Indexed DataFrame下df.loc与df.xs的性能对比
pandas多层索引(MultiIndex)场景下
loc与xs取值性能对比 核心结论
在仅匹配外层索引取值的场景下,df.loc的性能明显优于df.xs,数据量越大性能差距越明显,通常可达30%~60%。
性能测试验证
小样本数据集下二者性能差异可忽略,我们使用十万行规模的测试数据集做验证:
测试代码
import pandas as pd import numpy as np import timeit # 生成10万行规模的多层索引DataFrame day_count = 10000 meal_per_day = 10 days = [f"Day {i}" for i in range(day_count) for _ in range(meal_per_day)] meals = [i for _ in range(day_count) for i in range(meal_per_day)] hier_index = pd.MultiIndex.from_tuples(list(zip(days, meals))) df = pd.DataFrame( np.random.randint(500, 700, size=(day_count*meal_per_day, 2)), index=hier_index, columns=['M', 'F'] ) # 执行1000次取值统计耗时 time_loc = timeit.timeit("df.loc['Day 9999']", globals=globals(), number=1000) time_xs = timeit.timeit("df.xs('Day 9999')", globals=globals(), number=1000) print(f"loc 执行1000次耗时:{time_loc:.4f}s") print(f"xs 执行1000次耗时:{time_xs:.4f}s")
测试输出参考
loc 执行1000次耗时:0.0521s xs 执行1000次耗时:0.0897s
性能差异原因
loc是pandas官方原生的核心索引访问器,针对多层索引的外层匹配逻辑做了定向优化,直接走索引的哈希映射查找路径,没有多余的额外逻辑,执行效率最高xs是为跨任意层级取值设计的通用方法,底层会额外执行参数合法性校验、索引层级匹配判断、返回结果的索引重构逻辑,即便是简单的外层索引取值,也会走通用处理流程,因此开销更高
适用场景选择
- 如果仅需要取外层索引的匹配值,优先选择
loc,性能更优,语法也更通用 - 如果需要匹配非外层的索引值(比如示例中要取所有日期里第2餐的数据),
xs写法更简洁易读:df.xs(2, level=1),同等功能下loc需要写为df.loc[(slice(None), 2), :],可读性较差 - 注意
xs默认会将匹配到的索引层级从返回结果中移除,如果需要保留原索引结构,可添加参数drop_level=False
内容的提问来源于stack exchange,提问作者user17042197
相关产品推荐
相关产品推荐

