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

Python中pandas的copy()方法失效问题及正确用法咨询

问题

我有一个pandas DataFrame,希望创建它的副本并在副本上执行操作,确保不影响原数据。但使用.copy()方法后,原数据仍被修改了。以下是我的代码:

import pandas as pd
import numpy as np

x = np.array([1,2])
df = pd.DataFrame({'A': [x, x, x], 'B': [4, 5, 6]})

duplicate = df.copy()
duplicate['A'].values[0][[0,1]] = 0

print(duplicate)
print(df)

输出结果:

A  B
0  [0, 0]  4
1  [0, 0]  5
2  [0, 0]  6
        A  B
0  [0, 0]  4
1  [0, 0]  5
2  [0, 0]  6

可以看到原数据集df也受到了影响,请问这是什么原因,正确的做法应该是什么?


问题原因

  1. 元素引用重复:创建df时,A列的三个元素都指向同一个numpy数组x,三者共享同一个内存对象,修改其中任何一个都会同步影响其他元素。
  2. copy()的行为限制:df.copy()默认是深拷贝(deep=True),但它仅复制DataFrame的结构和元素的引用,不会对numpy数组这类可变对象本身进行递归深拷贝。因此修改副本中数组的内容时,原DataFrame里的数组引用也会同步看到变化。

正确做法

方法1:创建DataFrame时使用独立数组元素

避免多个元素共享同一数组引用,每个元素生成独立的numpy数组:

import pandas as pd
import numpy as np

# 每个元素都是新的数组,无引用共享
df = pd.DataFrame({'A': [np.array([1,2]), np.array([1,2]), np.array([1,2])], 'B': [4, 5, 6]})

duplicate = df.copy()
duplicate['A'].values[0][[0,1]] = 0

print(duplicate)
print(df)

方法2:对副本的object列做元素级深拷贝

针对已存在的共享引用DataFrame,先断开A列元素的引用关联,再修改:

import pandas as pd
import numpy as np

x = np.array([1,2])
df = pd.DataFrame({'A': [x, x, x], 'B': [4, 5, 6]})

duplicate = df.copy()
# 对A列每个数组独立拷贝,切断与原数组的引用
duplicate['A'] = duplicate['A'].apply(lambda arr: arr.copy())

duplicate['A'].values[0][[0,1]] = 0

print(duplicate)
print(df)

方法3:使用标准库做完全深拷贝

借助copy.deepcopy()递归拷贝所有层级的对象,彻底断开与原DataFrame的关联:

import pandas as pd
import numpy as np
import copy

x = np.array([1,2])
df = pd.DataFrame({'A': [x, x, x], 'B': [4, 5, 6]})

# 完全深拷贝所有嵌套对象
duplicate = copy.deepcopy(df)
duplicate['A'].values[0][[0,1]] = 0

print(duplicate)
print(df)

内容的提问来源于stack exchange,提问作者Amin Shn

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 19:40:34