2016-10-02 5 views
0

私はnumpy.random.permutation()を使って元のデータフレームXに対してランダムな順序を生成し、その全体をX_permにランダムな順序で割り当てる必要がありました。DataFrame.loc()はデータフレームにどのような影響を与えましたか?

X_perm=X 
y_perm=y 
perm = np.random.permutation(X.shape[0]) 
for i in range(len(perm)): 
    X_perm.loc[i]=(X.loc[perm[i]]) 
    y_perm.loc[i]=(y.loc[perm[i]]) 

コードを実行した後、X [0:1]によって与えられたXの最初のレコードは、実行前のケースに比べて変化しています。

Strange。私はX上で何も操作をしませんでしたが、その値を新しいデータフレームに割り当てます。どのようにしてX値の変化を引き起こしたか?この予期しない動作のため

乾杯
+1

'X_perm = X'の代わりに' X_perm = X.copy() 'に置き換えてください。 '='を使うと、リファレンスでコピーしているので、 'X'や' X_perm'のいずれかの変更は他のものに影響します。 – Abdou

+0

'X_perm = X'はコピーを作成しません。名前X_permをXで参照される同じオブジェクトにバインドするだけです.X_permで参照されるオブジェクトを変更すると、元のものに変更が加えられます。 –

答えて

0

理由はX_permがX_permへの変更もこれを実証するためにX.

に対して行われた変更されるように、XのX_permから独立している配列は、Xに参照されないことです:

import numpy as np 
a = np.arange(16) 
print a 
b = a # as your X_perm = X 
print b # same as print a above 
b[0] = -999 
print a # has been modified 
print b # has been modified 

a[-1] = -999 
print a # has been modified 
print b # has been modified 

# using copy 
a = np.arange(16) 
print a 
b = a.copy() # b is separate reference to array 
print b # same as print a above 
b[0] = -999 
print a # has NOT been modified 
print b # has been modified 

a[-1] = -999 
print a # has been modified 
print b # has NOT been modified 

はあなたが欲しいものを行うには、

X_perm = X.copy() 

も参照してくださいXのコピーであることをX_permする必要があります

関連する問題