2つのデータフレームが、操作を含まない同じ基本データの異なるコピーまたはビューであるかどうかを確認する簡単な方法はありますか?それぞれが生成されるタイミングを把握しようとしています。ルールがどのように特異的であるかを考えると、簡単なテスト方法が欲しいのですが。
たとえば、「id(df.values)」はビュー間で安定していると思いましたが、そうではありません:
# Make two data frames that are views of same data.
df = pd.DataFrame([[1,2,3,4],[5,6,7,8]], index = ['row1','row2'],
columns = ['a','b','c','d'])
df2 = df.iloc[0:2,:]
# Demonstrate they are views:
df.iloc[0,0] = 99
df2.iloc[0,0]
Out[70]: 99
# Now try and compare the id on values attribute
# Different despite being views!
id(df.values)
Out[71]: 4753564496
id(df2.values)
Out[72]: 4753603728
# And we can of course compare df and df2
df is df2
Out[73]: False
私が調べた、ルールを提供しようとする他の回答ですが、一貫性がないようであり、テスト方法のこの質問にも回答しません。
そしてもちろん:- http://pandas.pydata.org/pandas-docs/stable/indexing.html#returning-a-view-versus-a-copy
UPDATE:以下のコメントは質問に答えるようです-df.values.base
属性ではなくdf.values
属性を見ると、 df._is_copy
属性への参照を行います(後者は内部であるため、おそらく非常に悪い形式です)。
コメントでのHYRYとMariusの回答!
次のいずれかで確認できます。
次のように、values
属性ではなくvalues.base
属性の同等性をテストします。
df.values.base is df2.values.base
ではなくdf.values is df2.values
。
_is_view
属性を使用します(df2._is_view
はTrue
)。みんな、ありがとう!
あなたはパンダ/パイソン環境が消費しているメモリを追跡するかもしれません、そして、コピーがビューより多くのメモリを利用すると仮定して、何らかの方法で決定することができます。
python環境自体-Heapy/Guppyなど)内のメモリ使用量を示すライブラリが世の中にあると思います。
検査対象のオブジェクトを作成する前にメモリ使用量のベースライン写真を撮り、その後に別の写真を撮る、適用できるメトリックがあるはずです。 2つのメモリマップの比較(他に何も作成されておらず、変更が新しいオブジェクトによるものであると分離できると想定)は、ビューまたはコピーが作成されたかどうかのアイデアを提供します。
実装のタイプごとに異なるメモリプロファイルを理解する必要がありますが、いくつかの実験で結果が得られるはずです。