[英]Using .copy() to create a copy of a dictionary that can be editing without altering the original dictionary
[英]Editing Original DataFrame After Making a Copy but Before Editing the Copy Changes the Copy
我試圖了解如何復制pandas數據框。 當我在python中分配對象的副本時,我不習慣更改影響該對象副本的原始對象。 例如:
x = 3
y = x
x = 4
print(y)
3
雖然x
隨后被更改,但y保持不變。 相反,當我將pandas df
分配給副本df1
后對其進行更改時,副本也會受到原始DataFrame更改的影響。
import pandas as pd
import numpy as np
def minusone(x):
return int(x) - 1
df = pd.DataFrame({"A": [10,20,30,40,50], "B": [20, 30, 10, 40, 50], "C": [32, 234, 23, 23, 42523]})
df1 = df
print(df1['A'])
0 10
1 20
2 30
3 40
4 50
Name: A, dtype: int64
df['A'] = np.vectorize(minusone)(df['A'])
print(df1['A'])
0 9
1 19
2 29
3 39
4 49
Name: A, dtype: int64
解決方案似乎是使用copy.deepcopy()
進行深層復制,但是因為這種行為與我在python中習慣的行為不同,我想知道是否有人可以解釋這種差異背后的原因是什么,或者它是否是錯誤。
在第一個示例中,您沒有更改x
的值。 您為x
分配了一個新值。
在第二個示例中,您通過更改其中一個列來修改df
的值。
你也可以看到內置類型的效果:
>>> x = []
>>> y = x
>>> x.append(1)
>>> y
[1]
這種行為並非特定於熊貓; 它是Python的基礎。 關於同樣的問題,這個網站上有很多很多問題,都源於同樣的誤解。 語法
barename = value
與Python中的任何其他構造沒有相同的行為 。
當使用name[key] = value
或name.attr = value
或name.methodcall()
,您可能正在改變name
引用的對象的值,您可能正在復制某些內容等。使用name = value
(其中name
是單個標識符,沒有點,沒有括號等),你永遠不會改變任何東西,也不會復制任何東西。
在第一個示例中,您使用了語法x = ...
在第二個示例中,您使用了語法df['A'] = ...
這些語法不同,因此您不能假設它們具有相同的行為。
制作副本的方式取決於您嘗試復制的對象類型。 對於您的情況,請使用df1 = df.copy()
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.