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

如何在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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 21:55:15