2017-07-09 5 views
1

私はパンダのデータフレームにはかなり新しいですし、誰かが簡単に次の例で私にデータフレームの可変性について議論することができれば、それは非常に高く評価されるだろう:パンダデータフレームの可変性

d1=pd.date_range('1/1/2016',periods=10,freq='w') 
col1=['open','high','low','close'] 
list1=np.random.rand(10,4) 
df1=pd.DataFrame(list1,d1,col1) 

私の理解のため、現在、DF1がありますdfオブジェクトへの参照。

私は新しいDFへの入力として(例えばdf1.iloc[2:3,1:2])DF1またはDF1のスライスを渡すと、(例えばdf2=pd.DataFrame(df1))、データフレームの新しいインスタンスを返しDF2んか、それはまだDF2にさらさDF1を作るDF1を参照しています?

また、私がDataFrameの変更に関して注意しなければならない点については、非常に感謝しています。

答えて

2

この新しいデータフレームを構築し

df2 = pd.DataFrame(df1) 
。デフォルトの引数が Falsecopyパラメータがあります。文書によると、それは意味:

> Copy data from inputs. Only affects DataFrame/2d ndarray input 

ので、データはデフォルトでdf2df1の間で共有されます。

df2 = df1.iloc[2:3,1:2].copy() 

:あなたがこれを行う場合は

df2 = df1.copy() 

df2 = pd.DataFrame(df1, copy=True) 

以上の簡潔かつ慣用的に:あなたが共有するのではなく、完全なコピー何がないようにしたい場合は、これを行いますあなたは再び独立したコピーを得るでしょう。しかし、あなたはこれを行う場合:

df2 = pd.DataFrame(df1.iloc[2:3,1:2]) 

それはおそらくデータを共有しますが、dfを変更する場合は、このスタイルはかなり明確ではないので、私はそのようなコードを書いていないことをお勧めします。要約すると

df2 = df1.iloc[2:3,1:2] 

:あなたは何のコピーが必要ない場合は代わりに、ちょうどこれを言うあなたは、既存のデータを参照したい場合は、まったくpd.DataFrame()や他の方法を呼び出すことはありません。独立したコピーが必要な場合は、.copy()に電話してください。

+0

すぐに回答していただきありがとうございます。コピーメソッドを適用しない限り、一般的にdfからスライスすることが一般的には変更可能であると期待しているようです。概念的に正しいのですか? 上記のスライスの上に、私はデフォルトで.head()/ .tail()のような操作が、それらがそれ自身不変であるdfの新しいインスタンスを返すことを認識しています。私は.head()/ .tail()にはこの点に関しては変更がないと思います。 – user7786493

+0

一般的にdfの変更可能性についてのフォローアップの質問として、df(その列)の一部を新しいdf create mutationに割り当てるのはどうでしょうか? df1は 'dummy' 'DF2 = pd.DataFrame(インデックス= [1,2,3])を' DF1用の 'ダミー' の列は、に露出 'DF2 [ '新しいダミー'] = DF1 [ 'ダミー']続い' であります突然変異? – user7786493

+0

@ user7786493:No. –

1

これはおそらく、データを共有しますが、DFを変更する場合は、このスタイルはかなり明確ではないので、私はそのようなコードを書いていないことをお勧めします。あなたは何のコピーが必要ない場合は代わりに、ちょうどこれを言う:要するに

df2 = df1.iloc[2:3,1:2] 

:既存のデータを参照したい場合は、> pd.DataFrame()か、まったく他のメソッドを呼び出すことはありません。独立したコピーが必要な場合は、.copy()を呼び出してください。

私は同意しません。上記を実行すると、元のDataFrameのスライスされたセクションへの参照が返されます。したがって、df2を変更すると、df1に反映されます。

というより。

df2 = df1.iloc[2:3,1:2].copy() 
+0

スライスに関する別の質問として、df/Series自体のインデックスのように、df/Seriesオブジェクトのインデックスをスライスすると変更できない新しいオブジェクトが返される不変オブジェクトです元のもの、df.ilocの場合とは異なります。 最後の例では、 'df1.index [:]'は実際には参照を返すのではなく新しいインスタンス/オブジェクトを返します。私は正しいですか? – user7786493

+0

はい、インデックスをスライスすると、不変オブジェクトが返されます。 –