- 注:我问这个问题是因为我想更深入地了解后台的工作原理。我进入编程是作为一个“副业”,所以有很多事情我不知道或不理解,这让我很困扰。我只知道如何使用Python,不知道其他语言。我通常在DataSpell中使用Jupyter Notebooks。
**Topic:**在python中有一个.copy()
操作,它创建了一个浅拷贝(据我所知,它不是复制对象,而是创建一个引用/指向对象,所以基本上你只是做了另一个变量,可以访问同一个对象,并且它是相同的ID(?)),然后有一个.deepcopy()
操作真正复制对象,我猜这意味着在内存中这个对象将有它自己的位置,如果进行更改,它将不会影响原始对象。
**在Pandas中也有一个.copy()
函数。它允许你做一个(深)副本,例如。dataframe与将变量分配给相同的dataframe对象相反(df2 = df1
将仅将其指向相同的dataframe,而df2 = df1.copy()
将制作该帧的深层副本。如果在后一个示例中更改df 2,则不会影响df 1,但在前一个示例中会影响)。但是:
**实际问题:**Python和/或Pandas如何“知道”您使用的是哪个.copy()
?我假设如果你在非Pandas对象上使用.copy()
,那么它将使用Python的浅拷贝?不知何故,当.copy()
用于DataFrame或其他Pandas对象时,它“知道”它应该使用Pandas方法?我一般都很想学习/理解代码是如何阅读/解释的,但也出于实际原因问这个问题:
例如,如果我想复制一个包含多个DataFrame的字典,我如何知道df_dict_copy = df_dict.copy()
是否会复制或浅复制字典?
感谢任何答案和解释,也觉得费去超级书呆子和深入,因为我很好奇,并有兴趣在如何这东西的引擎盖下工作。
关于我和我的工作的更多背景,对当前的问题并不重要,但可以让我了解我实际使用Python的目的:
我是一名医生和研究员。我目前的项目使用一个中等规模的代谢组学数据集来预测各种疾病和症状。我正在研究不同的预处理方法,并使用各种机器学习算法来预测二元结果变量(是/否,1/0),数据集大约是6000行x 900个特征(尽管在一次热一些特征之后,有超过3000个额外的列作为稀疏矩阵)。使用二进制分类算法,主要是Scikit-Learn提供的算法,尽管我也尝试过XGBoost,CatBoost和LightGBM。为了准备数据,我使用了Numpy,Pandas和Scikit-Learn。
我只是想确保在使用.copy()时创建的是真实的的副本
如果有其他方法在不同的库中有相同的名字,我想知道是否应该做些什么来确保使用正确的方法等。
1条答案
按热度按时间k5hmc34c1#
如果在panda DataFrame上使用
.copy()
方法,则使用的是以下方法:https://pandas.pydata.org/docs/reference/api/pandas.DataFrame.copy.html此'copy()'方法属于DataFrame类(https://pandas.pydata.org/docs/reference/frame.html)。关于Python中类的一般信息可以在这里找到:https://docs.python.org/3/tutorial/classes.html
当你在一个具体的对象上调用一个类方法时,即
df.copy()
Python将计算对象的类型(在运行时,因为Python是动态类型的),并使用类定义中指定的方法。(这是一个小的简化)。如果
df
是DataFrame
类型的对象,则将使用在DataFrame
类的类定义中定义的.copy()
方法。如果对象df
是任何其他类型,则将使用该其他类型/类的方法。最主要的是:在每种情况下,
copy()
方法具有相同的名称,但属于不同的类。再举个例子。假设你有两个类和以下代码:
输出结果是什么?