识别另一个 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 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: Subindexing dataframes: Copies vs views
没有回答我如何在 df1
和 df2
上检查。
【问题讨论】:
Pandas: Subindexing dataframes: Copies vs views的可能重复 【参考方案1】:你可以提前设置dataframe的属性,df.is_copy = True
或df.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 中的连续相同值