Python 将值指定给dataframe的副本时,原始值也会更改

Python 将值指定给dataframe的副本时,原始值也会更改,python,pandas,dataframe,Python,Pandas,Dataframe,我提供了一个关于我的问题的简化示例: 我有这样一个数据框: cars = {'Brand': ['Honda Civic','Toyota Corolla','Ford Focus','Audi A4'], 'Price': [22000,25000,27000,35000] } df = pd.DataFrame(cars, columns = ['Brand','Price'], index=['Car_1','Car_2','Car_3','Car_4'

我提供了一个关于我的问题的简化示例:

我有这样一个数据框:


cars = {'Brand': ['Honda Civic','Toyota Corolla','Ford Focus','Audi A4'],
        'Price': [22000,25000,27000,35000]
        }

df = pd.DataFrame(cars, columns = ['Brand','Price'], index=['Car_1','Car_2','Car_3','Car_4'])
print (df)
            Brand  Price
Car_1     Honda Civic  22000
Car_2  Toyota Corolla  25000
Car_3      Ford Focus  27000
Car_4         Audi A4  35000
      

print (copy_df)
                Brand  Price
Car_1               0      0
Car_2  Toyota Corolla  25000
Car_3      Ford Focus  27000
Car_4         Audi A4  35000
如果我打印它,它看起来像这样:


cars = {'Brand': ['Honda Civic','Toyota Corolla','Ford Focus','Audi A4'],
        'Price': [22000,25000,27000,35000]
        }

df = pd.DataFrame(cars, columns = ['Brand','Price'], index=['Car_1','Car_2','Car_3','Car_4'])
print (df)
            Brand  Price
Car_1     Honda Civic  22000
Car_2  Toyota Corolla  25000
Car_3      Ford Focus  27000
Car_4         Audi A4  35000
      

print (copy_df)
                Brand  Price
Car_1               0      0
Car_2  Toyota Corolla  25000
Car_3      Ford Focus  27000
Car_4         Audi A4  35000
现在我想创建它的一个副本,只将副本eqaul的第一行设为零,如下所示:

copy_df=df

copy_df.iloc[0]=0
我的期望是,只有副本的第一行,
copy\u df
会这样更改:


cars = {'Brand': ['Honda Civic','Toyota Corolla','Ford Focus','Audi A4'],
        'Price': [22000,25000,27000,35000]
        }

df = pd.DataFrame(cars, columns = ['Brand','Price'], index=['Car_1','Car_2','Car_3','Car_4'])
print (df)
            Brand  Price
Car_1     Honda Civic  22000
Car_2  Toyota Corolla  25000
Car_3      Ford Focus  27000
Car_4         Audi A4  35000
      

print (copy_df)
                Brand  Price
Car_1               0      0
Car_2  Toyota Corolla  25000
Car_3      Ford Focus  27000
Car_4         Audi A4  35000
但是当我现在打印
df
时,它的第一行也会受到影响:

print (df)

              Brand  Price
Car_1               0      0
Car_2  Toyota Corolla  25000
Car_3      Ford Focus  27000
Car_4         Audi A4  35000

我的期望是不应该更改
df
中的第一行


有人能澄清一下吗?

你是这样复印的吗

df_copy=df.copy()

你是这样复印的吗

df_copy=df.copy()

在python中,某些数据类型的默认值是通过引用分配副本。在python中,这称为。我会让你自己熟悉这个想法,因为它也会出现在列表的实现中。它与的概念非常相似(但不尽相同)——也许你更熟悉这些术语

在Matlab中,一切都是通过值传递的。因此,如果您有一个列表,那么将复制所有值。而在python数据帧的这种情况下,则复制/分配变量的内存地址

为了解决这个问题,您应该使用df.copy()方法来实际复制当前状态下的数据帧

易变性和按引用传递有很好的/有用的用途,但当它来自其他语言时可能会令人困惑

copy_df = df.copy()

在python中,某些数据类型的默认值是通过引用分配副本。在python中,这称为。我会让你自己熟悉这个想法,因为它也会出现在列表的实现中。它与的概念非常相似(但不尽相同)——也许你更熟悉这些术语

在Matlab中,一切都是通过值传递的。因此,如果您有一个列表,那么将复制所有值。而在python数据帧的这种情况下,则复制/分配变量的内存地址

为了解决这个问题,您应该使用df.copy()方法来实际复制当前状态下的数据帧

易变性和按引用传递有很好的/有用的用途,但当它来自其他语言时可能会令人困惑

copy_df = df.copy()

copy_df=df
不创建df副本的。它生成一个新名称copy_df,该名称引用同一对象。
df.copy()
是您实际生成copy@JohnGordon这只是Python中的吗?据我记忆,在Matlab中,这是一个副本,我很困惑…在某些语言中,
a=b
将复制b。但不是python。请参见不创建df副本的
copy_df=df
。它生成一个新名称copy_df,该名称引用同一对象。
df.copy()
是您实际生成copy@JohnGordon这只是Python中的吗?据我记忆,在Matlab中,这是一个副本,我很困惑…在某些语言中,
a=b
将复制b。但不是python。请参见