【问题标题】:Why the dataframe is altered when only df.to_numpy() is involved in the computation?为什么只有 df.to_numpy() 参与计算时数据帧会被更改?
【发布时间】:2020-06-02 13:53:05
【问题描述】:
import pandas as pd
import numpy as np

url = "https://raw.githubusercontent.com/PawinData/UC/SFBA/DistanceMatrix_shortestnetworks.csv"
Distance_df = pd.read_csv(url, index_col=0)

D = Distance_df.to_numpy()

我有一个数据框 Distance_df 并将其转换为一个 numpy 数组 D 进行计算。随后发生的事情只涉及D,根本不涉及Distance_df。然而,DDistance_df 最后都被改变了(相同的东西)。

虽然我也不知道为什么D 会改变,但最让我困惑的是数据框Distance_df 的行为。 如果它甚至没有出现在代码中,怎么能改变它? 我感觉这与代码无关,而是在幕后如何处理值和对象。谁能解释一下?

【问题讨论】:

    标签: python pandas dataframe object numpy-ndarray


    【解决方案1】:

    您需要将copy=True 作为参数添加到to_numpy()

    根据DataFrame.to_numpy docs:

    copy : bool,默认为 False

    是否确保返回值不是另一个数组上的视图。请注意,copy=False 并不能确保 to_numpy() 是无副本的。相反,copy=True 确保制作副本,即使并非绝对必要。

    换句话说,写D = Distance_df.to_numpy()可能导致D成为Distance_df的底层numpy数组的引用,而不是复制它们。

    D = Distance_df.to_numpy(copy=True),确保DDistance_df是独立的对象。

    【讨论】:

    • 非常明确。非常感谢!
    【解决方案2】:

    尝试获取不被更改的数据帧副本

    import pandas as pd
    import numpy as np
    
    url="https://raw.githubusercontent.com/PawinData/UC/SFBA/DistanceMatrix_shortestnetworks.csv"
    
    Distance_df = pd.read_csv(url, index_col=0)
    
    df=Distance_df.copy()
    
    D = df.to_numpy()
    

    【讨论】:

      【解决方案3】:
      D = Distance_df.to_numpy()
      

      现在运行 D is Distance_df 返回 True。两个变量都指向同一个对象。

      但是,如果您执行D = Distance_df.copy().to_numpy()D is Distance_df 将返回False。它们现在是不同的对象。

      这就是 Python 处理变量引用的方式。

      【讨论】:

      • 谢谢!我现在对变量引用很警惕。
      猜你喜欢
      • 2019-05-24
      • 2013-08-17
      • 2012-04-30
      • 1970-01-01
      • 2020-06-15
      • 1970-01-01
      • 2019-06-13
      • 1970-01-01
      • 2018-11-13
      相关资源
      最近更新 更多