You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

Pandas DataFrame列重命名两种赋值方式的耗时差异原因探究

Pandas DataFrame列重命名两种赋值方式的耗时差异原因探究

嘿,这个问题问得特别到位!我来帮你拆解清楚这两种写法耗时差这么多的核心原因,其实本质是Pandas的rename方法默认行为两种写法的实际作用完全不同导致的。

先搞懂Pandas rename的默认逻辑

Pandas的rename方法默认是不修改原DataFrame的,它会创建一个包含修改后的列名(或索引)的新DataFrame副本,然后返回这个副本。这是Pandas中很多方法的设计原则——尽量避免原地修改,防止意外破坏原始数据。

两种写法的本质差异

我们结合你的代码来看:

  1. df = df.rename(...) (耗时高的写法)
    每次调用这个语句时,rename都会生成一个全新的DataFrame副本(把指定列名改成新名称),然后把变量df重新指向这个新副本。
    你的DataFrame规模极大(2000万行、21列),每次复制整个数据集都要花费大量的CPU和内存资源。你还连续调用了10次这个操作,相当于做了10次全量数据复制,累计下来耗时自然就很高了。

  2. df.rename(...) (耗时低但无效的写法)
    这个写法同样会让rename生成新的副本,但问题在于:这个新副本没有被任何变量保存!Python的垃圾回收机制会立刻把这个临时生成的副本标记为“可回收”,很快就会释放掉它占用的内存。
    更关键的是:你的原始DataFramedf根本没有被修改!你以为改了列名,但实际上原df的列名还是原来的var6var7这些,这个写法本质是做了一堆“无用功”——生成临时对象又立刻扔掉,所以它的耗时只是创建临时副本的时间,而且因为没有保留副本,内存压力小,整体耗时自然比第一种少很多。

如何高效地重命名列

既然知道了原因,那优化的方向就很明确了:

  • 一次性修改所有需要重命名的列:不要多次调用rename,把所有列名映射放在一个字典里,一次完成操作,避免多次复制数据:
    df.rename(columns={
        'var1':'VAR1', 'var2':'VAR2', 'var3':'VAR3',
        'var1a':'VAR1a', 'var2a':'VAR2a', ...
    }, inplace=True)
    
  • 使用inplace=True参数:这个参数会让rename直接在原DataFrame上修改列名,不会创建新的副本,内存和时间开销都会大幅降低。
  • 直接修改df.columns属性:如果你的重命名规则很有规律(比如把部分列名转大写),可以直接修改列名列表,这是最高效的方式:
    # 举例:把指定列名转大写,其他保持不变
    rename_map = {'var1':'VAR1', 'var2':'VAR2', 'var1a':'VAR1a'}
    df.columns = [rename_map.get(col, col) for col in df.columns]
    

这样操作的话,原本30多秒的耗时会降到几毫秒甚至更短,完全解决你的性能问题。

备注:内容来源于stack exchange,提问作者Craig Davis

火山引擎 最新活动