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

Posted

技术标签:

【中文标题】识别另一个 pandas DataFrame 的视图或副本【英文标题】:Identify view or copy of another pandas DataFrame 【发布时间】:2015-12-11 08:27:18 【问题描述】:

我想知道如何确定我是否有另一个数据框的视图或副本。给定一个 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 的副本或只是一个视图?

请注意,我看不出 DataFrames 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。

可能重复:Pandas: Subindexing dataframes: Copies vs views

没有回答我如何在 df1df2 上检查。

【问题讨论】:

Pandas: Subindexing dataframes: Copies vs views的可能重复 【参考方案1】:

你可以提前设置dataframe的属性,df.is_copy = Truedf.is_copy = False,后者应该避免警告。

【讨论】:

DataFrame.is_copy 已经是弱引用方法(type(df1.is_copy)weakref)或无(type(df2.is_copy) is NoneType `)。我不想覆盖这个。 DataFrame.is_copy 实际上在做什么?似乎通过调用它返回原始DataFrame。 我曾经将其设置为False,以避免警告并在当前数据帧而不是副本上进行操作。

以上是关于识别另一个 pandas DataFrame 的视图或副本的主要内容,如果未能解决你的问题,请参考以下文章

Pandas:查找不在另一个DataFrame中的DataFrame行[重复]

python [Pandas]识别DataFrame中的重复项

将一个 pandas DataFrame 的副本合并到另一个 DataFrame 的每一行中?

使用 Groupby 识别 Pandas Dataframe 中的连续相同值

绘制 pandas 多索引 DataFrame,其中一个索引作为 Y 轴,另一个作为 X 轴

pandas 怎么根据另一个dataframe来筛选