web-dev-qa-db-ja.com

データフレームがPandas

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属性への参照を行います(後者は内部であるため、おそらく非常に悪い形式です)。

34
nick_eu

コメントでのHYRYとMariusの回答!

次のいずれかで確認できます。

  • 次のように、values属性ではなくvalues.base属性の同等性をテストします。

    df.values.base is df2.values.baseではなくdf.values is df2.values

  • または(確かに内部)_is_view属性を使用します(df2._is_viewTrue)。

みんな、ありがとう!

25
nick_eu

あなたはパンダ/パイソン環境が消費しているメモリを追跡するかもしれません、そして、コピーがビューより多くのメモリを利用すると仮定して、何らかの方法で決定することができます。

python環境自体-Heapy/Guppyなど)内のメモリ使用量を示すライブラリが世の中にあると思います。

検査対象のオブジェクトを作成する前にメモリ使用量のベースライン写真を撮り、その後に別の写真を撮る、適用できるメトリックがあるはずです。 2つのメモリマップの比較(他に何も作成されておらず、変更が新しいオブジェクトによるものであると分離できると想定)は、ビューまたはコピーが作成されたかどうかのアイデアを提供します。

実装のタイプごとに異なるメモリプロファイルを理解する必要がありますが、いくつかの実験で結果が得られるはずです。

0
Thomas Kimber