【发布时间】:2015-01-08 20:08:00
【问题描述】:
是否有一种简单的方法可以检查两个数据帧是否是不涉及操作的相同基础数据的不同副本或视图?我试图掌握每个规则的生成时间,并且考虑到规则看起来有多么特殊,我想要一种简单的测试方法。
例如,我认为“id(df.values)”在各个视图中是稳定的,但它们似乎不是:
# Make two data frames that are views of same data.
df = pd.DataFrame([[1,2,3,4],[5,6,7,8]], index = ['row1','row2'],
columns = ['a','b','c','d'])
df2 = df.iloc[0:2,:]
# Demonstrate they are views:
df.iloc[0,0] = 99
df2.iloc[0,0]
Out[70]: 99
# Now try and compare the id on values attribute
# Different despite being views!
id(df.values)
Out[71]: 4753564496
id(df2.values)
Out[72]: 4753603728
# And we can of course compare df and df2
df is df2
Out[73]: False
我查找的其他答案试图给出规则,但似乎不一致,也没有回答如何测试这个问题:
当然还有: - http://pandas.pydata.org/pandas-docs/stable/indexing.html#returning-a-view-versus-a-copy
更新: 下面的评论似乎回答了这个问题——查看df.values.base 属性而不是df.values 属性,以及对df._is_copy 属性的引用(尽管后者可能是非常糟糕的形式,因为它是内部的)。
【问题讨论】:
-
嗯,
df2._is_view返回True但鉴于它被标记为私有/内部,可能有更好的方法来解决它。 -
对于您的情况,您可以使用:
df2.values.base is df.values.base -
一般来说,
df.values会创建一个副本,除非它是一个单一的 dtype(因为计算量很大)。你为什么要关心它是否是一个视图以及你实际上想要做什么? -
太棒了!感谢 HYRY 和 Marius!那些肯定会这样做——我没有发现 values.base,也不知道 _is_view 属性(尽管正如你所说,可能最好避免使用它,因为它是内部的)。
-
@HYRY 那么
id's呢?如果只有一个对象,为什么它们会有所不同?还是视图是另一个对象?
标签: python pandas chained-assignment