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

为何修改DataFrame副本时原始DataFrame也会被更新?

问题原因与解决办法

问题根源

你遇到的问题核心在于Pandas的DataFrame是可变对象:当你把base传入dosomething函数时,函数接收的是原始DataFrame的引用,而非独立的副本。这意味着函数里对df的修改会直接作用在原始的base上,导致它也被同步更新。

解决办法

有两种实用的方式可以避免这个问题:

方式1:传入函数前先创建副本

调用函数时,用copy()方法生成base的独立副本,再传给函数操作:

import pandas as pd

# 创建基础df
base = pd.DataFrame([[1,2],[3,4]])

# 对df执行操作的简单函数
def dosomething(df):
    df[0] = [5,6]
    return df

# 传入base的副本而非原始对象
new = dosomething(base.copy())

# 打印new和base df
print(new)
print(base)

运行后base会保持原始状态:

0  1
0  5  2
1  6  4
   0  1
0  1  2
1  3  4

方式2:在函数内部创建副本再修改

修改dosomething函数,先对传入的DataFrame创建副本,再操作副本并返回:

import pandas as pd

# 创建基础df
base = pd.DataFrame([[1,2],[3,4]])

# 对df执行操作的简单函数
def dosomething(df):
    # 先创建传入df的独立副本
    df_copy = df.copy()
    df_copy[0] = [5,6]
    return df_copy

# 创建新df
new = dosomething(base)

# 打印new和base df
print(new)
print(base)

这种方式下,无论调用时传入的是原始对象还是其他引用,函数内部都会操作独立副本,不会影响原始数据。

补充说明

如果你的DataFrame包含嵌套对象(比如列里有列表、字典),需要用copy(deep=True)来创建深度副本,确保所有嵌套结构都被独立复制。默认的copy()是浅复制,对简单数值型DataFrame已经足够使用。

内容的提问来源于stack exchange,提问作者Michael Wilson

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.20 07:47:36