识别另一个pandas DataFrame的视图或副本

时间:2015-09-15 07:20:05

标签: python pandas chained-assignment

我想知道如何确定我是否拥有另一个数据帧的视图或副本。给出一个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 df1df2中看到任何差异
>>> 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。

可能的dublicate:Pandas: Subindexing dataframes: Copies vs views

没有回答我如何在df1df2上查看此内容。

1 个答案:

答案 0 :(得分:0)

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