2017-07-07 9 views
3

コピーを取得したブールインデックスでDataFrameをスライスし、元のDataFrameとは独立してそのコピーを処理したいとします。パンダのデータフレームを新しいDataFrameにスライスする

answerから判断すると、ブール配列を使用して.locを選択するとコピーが返されますが、コピーを変更しようとすると、途中でコピーされます。これは、正しい方法だろう:あなたはboolean indexingcopy、必要

import numpy as np 
import pandas as pd 
d1 = pd.DataFrame(np.random.randn(10, 5), columns=['a', 'b', 'c', 'd', 'e']) 
# create a new dataframe from the sliced copy 
d2 = pd.DataFrame(d1.loc[d1.a > 1, :]) 
# do stuff with d2, keep d1 unchanged 
+0

'SettingWithCopyWarning'は単なる警告です。そのDataFrameで行った変更は元のDataFrameを変更しないことを示します。それらを完全に無効にすることもできますし、割り当ての後に 'd2.is_copy = None'を使うこともできます。 – ayhan

答えて

2

新しいDataFrameコンストラクタは必要ありません:警告の

d2 = d1[d1.a > 1].copy() 

説明:

後でd2で値を変更した場合変更内容が元のデータ(d1)に戻されず、Pandasが警告を発していることがわかります。

+0

これは私が使っていたものですが、 '.copy()'は推奨されている方法ではないことを私がどこかで読んだようですが、私はそれを変更しました。 –

+0

はい、新しいオブジェクトが必要な場合コピーが必要です。もともとの 'd1 = d1 [d1.a> 1]'が必要ない場合は、同様に動作するはずです。 – jezrael

関連する問題