为什么pandas 数据框可以互相改变?

Dan*_* Lo 2 python oop pandas

我正在尝试保留 Pandas 数据框的副本,以便我可以在保存原始数据的同时对其进行修改。但是当我修改副本时,原始数据框也会发生变化。前任:

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
Run Code Online (Sandbox Code Playgroud)

我设置df2等于df1,然后当我修改时df2df1也改变了。为什么会这样,有什么方法可以在不修改的情况下保存熊猫数据框的“备份”?

jak*_*vdp 10

这比数据帧要深刻得多:您正在以错误的方式考虑 Python 变量。Python 变量是指针,而不是桶。也就是说,当你写

>>> y = [1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

您没有放入[1, 2, 3]名为y;的桶中。而是要创建一个命名指针y指向[1, 2, 3]

当你然后写

>>> x = y
Run Code Online (Sandbox Code Playgroud)

您没有将 的内容y放入名为 的存储桶中x;要创建一个命名指针x指向同一件事那个y点。因此:

>>> x[1] = 100
>>> print(y)
[1, 100, 3]
Run Code Online (Sandbox Code Playgroud)

因为xandy指向同一个对象,通过一个指针修改它也会为另一个指针修改它。如果您想指向一个副本,则需要明确创建一个副本。使用列表,您可以这样做:

>>> y = [1, 2, 3]
>>> x = y[:]
>>> x[1] = 100
>>> print(y)
[1, 2, 3]
Run Code Online (Sandbox Code Playgroud)

使用数据帧,您可以使用以下copy()方法创建副本:

>>> df2 = df1.copy()
Run Code Online (Sandbox Code Playgroud)


Mik*_*ler 3

您需要复印:

df2 = df1.copy()

df2['col2'] = df2['col2'] + 1
print(df1)
Run Code Online (Sandbox Code Playgroud)

输出:

  col1  col2
0    a     1
1    b     2
2    c     3
3    d     4
Run Code Online (Sandbox Code Playgroud)

df1您只需为with创建第二个名称df2 = df1