2016-02-27 51 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()