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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 11:54:00