为什么PandasDataFrame可以互相改变?

xam8gpfp  于 2022-12-10  发布在  其他
关注(0)|答案(3)|浏览(156)

我试图保留一个Pandas Dataframe 的副本,这样我可以在保存原始 Dataframe 的同时修改它。但是当我修改副本时,原始 Dataframe 也会改变。例如:

df1=pd.DataFrame({'col1':['a','b','c','d'],'col2':[1,2,3,4]})
df1

    col1    col2
    a       1
    b       2
    c       3
    d       4

df2=df1
df2['col2']=df2['col2']+1
df1

    col1    col2
    a       2
    b       3
    c       4
    d       5

我将df2设置为等于df1,然后当我修改df2时,df1也发生了变化。为什么会发生这种情况?有没有办法保存Pandas Dataframe 的“备份”而不对其进行修改?

jmo0nnb3

jmo0nnb31#

这比 Dataframe 要深刻得多:你对Python变量的理解是错误的。Python变量是指针,而不是桶。也就是说,当你写

>>> y = [1, 2, 3]

您没有将[1, 2, 3]放入名为y的存储桶中;而是创建一个指向[1, 2, 3]的名为y的指针。
当你接着写

>>> x = y

您没有将y的内容放入名为x的桶中;您正在创建一个名为x的指针,它指向的 * 与y指向的 * 相同。因此:

>>> x[1] = 100
>>> print(y)
[1, 100, 3]

因为xy指向同一个对象,所以通过一个指针修改它也会修改另一个指针的对象。如果你想指向一个副本,你需要显式地创建一个副本。使用列表,你可以这样做:

>>> y = [1, 2, 3]
>>> x = y[:]
>>> x[1] = 100
>>> print(y)
[1, 2, 3]

使用DataFrame,您可以使用copy()方法建立复本:

>>> df2 = df1.copy()
bqucvtff

bqucvtff2#

您需要制作一份副本:

df2 = df1.copy()

df2['col2'] = df2['col2'] + 1
print(df1)

输出量:

col1  col2
0    a     1
1    b     2
2    c     3
3    d     4

您只需使用df2 = df1df1创建第二个名称。

ssm49v7z

ssm49v7z3#

当您将一个数据框设置为等于另一个数据框时,它会在计算机内存中保持其数据的相同位置。这意味着如果您更改新数据框中的一个值,它也会更改旧数据框中的该值。要解决此问题,您应该制作一个数据框的副本,而不仅仅是使其等于原始数据框。示例:df2 = df1.copy()

相关问题