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

Pandas DataFrame执行fillna时方括号选列比loc慢的原因问询

两种列选择方式fillna耗时差异的核心原因

虽然df[col]和df.loc[:, col]返回的列数据值完全一致,但二者的底层索引逻辑、返回对象的内存机制存在本质差异,最终导致赋值操作耗时差距极大,核心原因如下:

  • 索引逻辑的歧义检查开销不同
    []操作符(对应pandas的__getitem__方法)本身支持行选择、列选择、布尔索引等多种语义,执行时需要先判断传入参数的类型、匹配对应索引规则,存在大量额外的校验逻辑;而loc是专门设计的显式标签索引器,语义固定为「行, 列」的定位逻辑,跳过了大量歧义判断步骤,执行效率更高。
  • 内存机制的差异:视图vs副本
    df.loc[:, col]的返回结果是原DataFrame的内存视图(view),和原数据共享内存块,对其赋值时直接修改原内存地址的数据,不需要额外的内存拷贝。
    而df[col]的返回结果受DataFrame内存布局、列数据类型、选中列数量的影响,绝大多数场景下会返回独立的内存副本(copy),执行df[col] = 新值的操作时,pandas需要先将填充完的副本数据再写回原DataFrame的内存块,多了两次大体积数据的内存拷贝操作,当数据量较大时耗时会出现量级上升。

你可以通过numpy的内存共享检查工具验证这一点:

import numpy as np
# 大概率返回True,代表共享内存
print(np.shares_memory(df, df.loc[:, col]))
# 大概率返回False,代表是独立副本
print(np.shares_memory(df, df[col]))

注:此前看到的“二者效果一致”的结论仅针对选中的数据值,不涉及底层的内存对象属性。pandas官方也更推荐使用loc/iloc做显式的索引赋值,既可以避免链式索引的SettingWithCopyWarning警告,也能获得更稳定的执行性能。

内容的提问来源于stack exchange,提问作者piyush-balwani

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 22:15:01