Pandas中df.T[:10].T与df.iloc[:,:10]的效率对比及优劣分析
DataFrame截取前N列:两种方法的效率对比与优缺点分析
针对形状为(20,20)的DataFrame截取前10列的两种写法,我们来拆解下它们的效率差异和各自的优缺点:
效率对比:df.iloc[:,:10]远胜df.T[:10].T
结论很明确:iloc的写法效率高得多,尤其是当DataFrame规模扩大时,差距会被无限放大。
原因在于:
df.T[:10].T需要两次转置操作,每次转置都会创建整个DataFrame的副本——第一次把20行20列转成20列20行,复制所有400个数据;取前10行后再转置回去,又要复制一次筛选后的200个数据。整个过程有两次完整的数据复制,内存和时间开销都不小。df.iloc[:,:10]是pandas专门设计的位置索引切片,它直接基于原数据的位置信息进行筛选,不会创建中间副本(默认生成原数据的视图,只有后续修改数据时才会触发复制),全程只是定位数据的位置,没有多余的内存占用和计算步骤。
各自的优缺点
df.iloc[:,:10]
- 优点:
- 可读性拉满:
iloc是pandas官方推荐的位置索引方法,:,:10直白表示“所有行,前10列”,任何人看代码都能秒懂意图。 - 性能优异:无中间副本,大表场景下速度和内存优势极其明显。
- 兼容性强:不管列名是什么(哪怕不是连续数字或字符串),只要按位置取列就不会出错,逻辑严谨稳定。
- 可读性拉满:
- 缺点:几乎没有实质性缺点,硬要说的话,可能对完全没接触过pandas位置索引的新手,需要花1分钟理解
iloc的用法,但这是学习pandas的基础内容。
df.T[:10].T
- 优点:
- 逻辑上能实现需求,对刚接触pandas的新手来说,可能会先想到“转置后取行再转回去”的思路,不需要额外记忆
iloc的用法。
- 逻辑上能实现需求,对刚接触pandas的新手来说,可能会先想到“转置后取行再转回去”的思路,不需要额外记忆
- 缺点:
- 效率低下:两次转置的复制操作,在大表(比如10000行10000列)场景下,内存占用和耗时会是
iloc的数倍甚至数十倍。 - 可读性差:代码需要绕个弯才能理解是取前10列,别人维护代码时需要反应一下,增加了沟通成本。
- 扩展性差:如果要取非前N列(比如第5到15列),这种转置写法会变得非常繁琐,而
iloc只需要改成iloc[:,4:15]就能轻松实现。
- 效率低下:两次转置的复制操作,在大表(比如10000行10000列)场景下,内存占用和耗时会是
最佳实践
正如你推测的,虽然小表下两者效率差异可以忽略,但**iloc写法是绝对的最佳实践**——可读性、效率、扩展性都完胜转置的写法,也是pandas社区公认的标准用法。
内容的提问来源于stack exchange,提问作者Plod
相关产品推荐
相关产品推荐

