簡體   English   中英

在復制之后但在編輯復制之前編輯原始DataFrame會更改復制

[英]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] = valuename.attr = valuename.methodcall() ,您可能正在改變name引用的對象的值,您可能正在復制某些內容等。使用name = value (其中name是單個標識符,沒有點,沒有括號等),你永遠不會改變任何東西,也不會復制任何東西。

在第一個示例中,您使用了語法x = ... 在第二個示例中,您使用了語法df['A'] = ... 這些語法不同,因此您不能假設它們具有相同的行為。

制作副本的方式取決於您嘗試復制的對象類型。 對於您的情況,請使用df1 = df.copy()

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM