识别、查看或复制另一个pandas DataFrame的视图或副本。

4

我想知道如何确定我是否拥有另一个数据帧的视图或副本。给定一个 pandas.DataFrame

import pandas as pd

df = pd.DataFrame( {'a': [0,8,15], 'b': [42,11,0] } )

以及一个视图

df1 = df.loc[ 1:2 ]

以及一份副本

df2 = df.loc[ 1:2 ].copy()

这会导致
>>> df
    a   b
0   0  42
1   8  11
2  42   0
>>> df1
    a   b
1   8  11
2  42   0
>>> df2
    a   b
1   8  11
2  42   0

给已有的列分配值会导致df1出现警告。

>>> df1[ 'a' ] = 42
value is trying to be set on a copy of a slice from a DataFrame.
Try using .loc[row_indexer,col_indexer] = value instead

See the the caveats in the documentation: http://pandas.pydata.org/pandas-docs/stable/indexing.html#indexing-view-versus-copy
  #!/usr/bin/python

但对于df2则不是这样。不过,无论哪种情况,值的分配都能够正常工作。我该如何确定我是否有另一个DataFrame的副本或视图?

请注意,我无法通过类型看出DataFrame df1和df2之间的任何区别。

>>> type(df1),type(df2)

通过逐个比较元素的相等性
>>> df1 == df2
      a     b
1  True  True
2  True  True

通过比较NDFrame对象

>>> df1.equals

甚至可以通过比较列的顺序来进行。

>>> from pandas.util.testing import assert_frame_equal
>>> assert_frame_equal(df1, df2)

请注意,使用视图df1也会更改原始的DataFrame。
可能存在重复:Pandas:子索引数据框:副本 vs 视图 这并不能回答我如何在df1df2上检查此问题。

可能是Pandas:子索引数据框:副本与视图的重复问题。 - Alexander
1个回答

0

您可以预先设置数据框的属性,使用 df.is_copy = Truedf.is_copy = False,后者应该避免警告。


DataFrame.is_copy 已经是一个弱引用方法(type(df1.is_copy)weakref)或者为 None (type(df2.is_copy) is NoneType`)。我不想覆盖它。 - desiato
1
DataFrame.is_copy实际上在做什么?调用它似乎会返回原始的DataFrame。 - desiato
我曾经将其设置为“False”,以避免警告并在当前数据框上操作,而不是在副本上操作。 - Fabio Lamanna

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接