我想知道如何确定我是否拥有另一个数据帧的视图或副本。给定一个 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 视图 这并不能回答我如何在
df1
和df2
上检查此问题。