2016-10-02 117 views
0

我使用numpy.random.permutation()生成一個原始數據框X的隨機順序,並想按照隨機順序將整個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給定的X的第一個記錄[0:1]變更運行前比較的情況。

奇怪。我沒有對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. X_perm的是到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.

X_perm = X.copy() 

參見副本

相關問題