2016-02-27 81 views
-1

我试图保留熊猫数据框的副本,以便我可以在保存原始数据时对其进行修改。但是当我修改副本时,原始数据框也会发生变化。例:为什么熊猫数据框可以彼此改变?

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,那么当我修改df2df1也发生变化。为什么会这样,并且有什么方法可以保存熊猫数据框的“备份”而不用修改?

+2

这是因为你只是让'df2'的代名词'DF1 '。他们指的是同一个对象。为了改变这种情况,我相信你可以做'df2 = df1.copy()'。 – zondo

+1

这是一个Python问题,与大熊猫无关。当你做你的任务时,你会得到一个指向同一个对象的指针。你可以通过输入你的IDE'id(df2)'和'id(df1)'来确认,注意这些值是相同的('id'返回变量引用的对象的内存位置)。你可以用列表来做同样的事情。 'list_1 = [1,2]''list_2 = list_1'' list_2 [0] = 10'' >>> list_1' returns [10,2] – Alexander

+0

http://nedbatchelder.com/text/names。html可能会帮助你一些相关的理解 –

回答

1

你需要做一个副本:

df2 = df1.copy() 

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

输出:

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

你只是df1创建第二个名称以df2 = df1

0

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

1

这比dataframes更深入:你正在考虑Python变量的错误方式。 Python变量是指针,而不是桶。也就是说,当你写

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

你是不是把[1, 2, 3]到一个名为y桶;而是创建一个名为y的指针,指向[1, 2, 3]

当你再写入

>>> 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] 

与dataframes,您可以创建一个copy()方法副本:

>>> df2 = df1.copy()