誰か違いを説明してくれませんか?
df2 = df1
df2 = df1.copy()
df3 = df1.copy(deep=False)
私はすべてのオプションを試し、次のようにしました。
df1 = pd.DataFrame([1,2,3,4,5])
df2 = df1
df3 = df1.copy()
df4 = df1.copy(deep=False)
df1 = pd.DataFrame([9,9,9])
次のように返されます。
df1: [9,9,9]
df2: [1,2,3,4,5]
df3: [1,2,3,4,5]
df4: [1,2,3,4,5]
.copy()
したがって、との出力に違いは見られません.copy(deep=False)
。なぜでしょうか?
オプション '='、copy()、copy(deep=False) のいずれかが返されることを期待します。[9,9,9]
何が足りないのでしょうか?
ベストアンサー1
作成したさまざまな DataFrame のオブジェクト ID を見ると、何が起こっているのかが明確にわかります。
と書くとdf2 = df1
、 という名前の変数を作成しdf2
、それを id を持つオブジェクトにバインドします4541269200
。 と書くとdf1 = pd.DataFrame([9,9,9])
、 を作成します。新しいid を持つオブジェクトを作成し4541271120
、それを変数にバインドしますが、以前にバインドされていたdf1
id を持つオブジェクトは存続します。そのオブジェクトにバインドされた変数がない場合、Python によってガベージ コレクションされます。4541269200
df1
In[33]: import pandas as pd
In[34]: df1 = pd.DataFrame([1,2,3,4,5])
In[35]: id(df1)
Out[35]: 4541269200
In[36]: df2 = df1
In[37]: id(df2)
Out[37]: 4541269200 # Same id as df1
In[38]: df3 = df1.copy()
In[39]: id(df3)
Out[39]: 4541269584 # New object, new id.
In[40]: df4 = df1.copy(deep=False)
In[41]: id(df4)
Out[41]: 4541269072 # New object, new id.
In[42]: df1 = pd.DataFrame([9, 9, 9])
In[43]: id(df1)
Out[43]: 4541271120 # New object created and bound to name 'df1'.
In[44]: id(df2)
Out[44]: 4541269200 # Old object's id not impacted.
編集: 2018年7月30日に追加
ディープコピーパンダでは動作しません開発者は、可変オブジェクトを DataFrame 内に配置することをアンチパターンとみなしています。次の点を考慮してください。
In[10]: arr1 = [1, 2, 3]
In[11]: arr2 = [1, 2, 3, 4]
In[12]: df1 = pd.DataFrame([[arr1], [arr2]], columns=['A'])
In[13]: df1.applymap(id)
Out[13]:
A
0 4515714832
1 4515734952
In[14]: df2 = df1.copy(deep=True)
In[15]: df2.applymap(id)
Out[15]:
A
0 4515714832
1 4515734952
In[16]: df2.loc[0, 'A'].append(55)
In[17]: df2
Out[17]:
A
0 [1, 2, 3, 55]
1 [1, 2, 3, 4]
In[18]: df1
Out[18]:
A
0 [1, 2, 3, 55]
1 [1, 2, 3, 4]
df2
真のディープ コピーであれば、その中に含まれるリストに新しい ID が付与されているはずです。その結果、df2 内のリストを変更すると、同じオブジェクトであるため、df1 内のリストにも影響が及びます。