2016-10-02 84 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() 

参见副本

相关问题