如何在Pandas中执行原地(in place)向量化操作?
如何对pandas.DataFrame或pandas.Series执行**原地(in place)**向量化操作?
我目前仅能找到会创建并返回副本的实现方法,主要关注减少资源占用,但哪怕效率不高,也想了解是否存在这样的实现方式。
当前常见的实现方式
import pandas as pd import numpy as np df = pd.DataFrame({'a': [1,2,3], 'b': [4,5,6]}) # 此时df为: # a b # 0 1 4 # 1 2 5 # 2 3 6 df['c'] = df['a'] + df['b'] # 此时df变为: # a b c # 0 1 4 5 # 1 2 5 7 # 2 3 6 9 # 或者这样实现 df['c'] = np.log(df['a']) # 此时df变为: # a b c # 0 1 4 0.000000 # 1 2 5 0.693147 # 2 3 6 1.098612 # 也可以用这些方法: # df['c'] = df['a'].apply(np.log) # df['c'] = np.vectorize(np.log)(df['a'])
期望的类似R data.table的原地操作方式
df[c = np.log(a)] # 此时df变为: # a b c # 0 1 4 0.000000 # 1 2 5 0.693147 # 2 3 6 1.098612 # 甚至是这样: df['a'].apply(np.log, inplace=True) # 该方法实际不存在 # 从而实现对列'a'的原地转换 # 转换后df[['a','b']]为: # a b # 0 0.000000 4 # 1 0.693147 5 # 2 1.098612 6
可行的原地操作方案
1. 直接列赋值(高效的原地新增/修改)
首先要明确:df['new_col'] = ...或df['existing_col'] = ...这种赋值方式本身就是原地修改DataFrame,不会创建整个DataFrame的副本。DataFrame是可变对象,这类操作直接在原对象上新增/更新列数据,资源占用已经很低,是pandas中最常用的原地操作方式。
比如你写的df['c'] = df['a'] + df['b'],本质就是原地新增列c,并没有复制整个DataFrame。
2. 直接修改底层numpy数组(完全原地修改现有列)
如果要彻底避免中间产生的Series副本,可以直接操作Series的底层numpy数组,这是真正意义上的原地内存修改:
import pandas as pd import numpy as np df = pd.DataFrame({'a': [1,2,3], 'b': [4,5,6]}) # 原地修改列'a'的值,无中间副本 df['a'].values[:] = np.log(df['a'].values)
这种方式直接对numpy数组的内存进行覆盖,不会创建新的Series对象,资源占用最小。
3. 类似data.table的语法替代
pandas没有R data.table那样的df[c = ...]语法,但可以用df.loc实现等价的原地操作:
# 原地新增列'c'并赋值 df.loc[:, 'c'] = np.log(df['a'])
效果和df['c'] = ...完全一致,都是原地修改。
关于apply的原地实现
pandas.Series.apply()确实没有inplace=True参数,但可以通过直接赋值或底层数组修改的方式实现原地效果:
# 方式1:直接赋值(本质原地修改列) df['a'] = df['a'].apply(np.log) # 方式2:底层数组修改(完全原地) df['a'].values[:] = df['a'].apply(np.log).values
内容的提问来源于stack exchange,提问作者Kaleb Coberly
相关产品推荐
相关产品推荐

