【问题标题】:Why can pandas DataFrames change each other?为什么 pandas DataFrames 可以互相改变?
【发布时间】:2016-06-10 11:03:16
【问题描述】:

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

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,然后我修改df2时,df1也变了。为什么会这样?有什么方法可以保存 Pandas DataFrame 的“备份”而不对其进行修改?

【问题讨论】:

  • 这是因为您只是将df2 设为df1 的同义词。它们指的是同一个对象。要改变这一点,我相信你可以做到df2 = df1.copy()
  • 这是一个 Python 问题,与 Pandas 无关。当你做你的任务时,你会得到一个指向同一个对象的指针。您可以通过在 IDE 中键入 id(df2)id(df1) 来确认这一点,注意它们的值是相同的(id 返回变量引用的对象的内存位置)。您可以对列表执行相同的操作。 list_1 = [1, 2] list_2 = list_1 list_2[0] = 10 >>> list_1 返回 [10, 2]
  • nedbatchelder.com/text/names.html 可能会帮助您了解一些相关的知识

标签: python pandas oop


【解决方案1】:

这比数据框要深刻得多:您以错误的方式考虑 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()

【讨论】:

    【解决方案2】:

    你需要复制一份:

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

    输出:

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

    您只需使用df2 = df1df1 创建第二个名称。

    【讨论】:

      【解决方案3】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-02-24
        • 1970-01-01
        • 2019-06-02
        • 1970-01-01
        • 2015-06-02
        • 1970-01-01
        • 2021-07-22
        • 2022-08-02
        相关资源
        最近更新 更多