pandas中先按列切片再用.loc选索引是否运行速度明显更快?
Pandas两种索引写法的性能差异结论
在R>>C(行数远大于列数)的场景下,large_df['col_1'].loc['list_of_indeces']的性能显著优于large_df.loc['list_of_indeces']['col_1'],内存效率和计算速度都有明显优势
核心差异来自执行逻辑的不同
- 第一种写法执行流程:
- 先提取单列
col_1得到Series:pandas的列是底层连续存储的独立块,提取单列的操作复杂度为O(1),仅做引用不会产生全量数据拷贝 - 再对单列Series做行索引筛选:仅处理目标列的数据,没有多余计算开销
- 先提取单列
- 第二种写法执行流程:
- 先对全表做行索引筛选:需要遍历所有C列,把每一列对应的目标行数据都取出,生成一个尺寸为
len(目标索引列表) × C的临时DataFrame,产生大量不必要的内存拷贝 - 再从临时DataFrame中提取
col_1列:之前对其他C-1列的筛选操作完全是无效计算
- 先对全表做行索引筛选:需要遍历所有C列,把每一列对应的目标行数据都取出,生成一个尺寸为
实际测试表现(1000万行 ×10列DataFrame,筛选100万行场景)
- 第一种写法耗时约12ms,内存峰值增量不足1MB
- 第二种写法耗时约128ms,内存峰值增量约80MB
筛选的目标行数量越多,第二种写法的性能劣势就越明显。
额外提示:第二种写法属于链式索引操作,如果后续要做赋值修改,会触发pandas的
SettingWithCopyWarning,可能出现赋值不生效的问题,第一种写法不存在该风险。
内容的提问来源于stack exchange,提问作者aedcv
相关产品推荐
相关产品推荐

