使用inplace=True重命名DataFrame列是否无复制操作?是否存在问题?
问题
已有大量文献探讨处理DataFrame时使用inplace=True的弊端,但用inplace=True重命名列是否安全?执行df.rename(columns={'old': 'new'}, inplace=True)时,是否有数据块被复制并丢弃?
另外通过计时测试发现,原地重命名列比赋值拷贝更快,且大型DataFrame下速度优势更显著,耗时不依赖DataFrame大小。测试代码及结果如下,能否据此得出后台未进行数据复制的结论?
分析与结论
重命名列用
inplace=True是安全的:DataFrame的列名属于元数据(而非实际存储的数值数据块),rename(..., inplace=True)仅直接修改原DataFrame对象的列名属性,不会触碰底层的数值数据,不存在数据丢失或意外篡改的风险。计时结果可证明无数据复制:你的测试里,原地操作耗时仅约0.003秒,远低于非原地操作的0.17秒,且耗时不随DataFrame大小变化——如果存在数据复制,大型DataFrame的操作耗时会显著上升。这完全符合“仅修改元数据”的特征:元数据修改的开销极小,和数据量无关。
非原地操作更慢的原因:执行
df = df.rename(...)时,Pandas会创建新的DataFrame对象,即便底层数据可能是原数据的视图(未复制),但新对象的创建、元数据拷贝等步骤仍会产生额外开销,这就是非原地操作耗时更高的核心原因。
测试代码
import numpy as np import pandas as pd import time df = pd.DataFrame(np.random.rand(10**6,5), columns=list('abcde')) d1 = dict(zip(list('abcde'),list('ABCDE'))) d2 = dict(zip(list('ABCDE'),list('abcde'))) t0 = time.perf_counter() for i in range(10): df.rename(columns=d1, inplace=True) df.rename(columns=d2, inplace=True) t1 = time.perf_counter() for i in range(10): df = df.rename(columns=d1) df = df.rename(columns=d2) t2 = time.perf_counter() print('inplace : ', t1-t0) print('df = df : ', t2-t1)
测试结果
inplace : 0.003490000000000215 df = df : 0.1703701999999998
内容的提问来源于stack exchange,提问作者Martin R
相关产品推荐
相关产品推荐

