Numpy np.array';s aType是否阻止将来在数据帧中进行编辑?
我可以首先更改数据帧的第一个条目:Numpy np.array';s aType是否阻止将来在数据帧中进行编辑?,numpy,dataframe,pandas,Numpy,Dataframe,Pandas,我可以首先更改数据帧的第一个条目: In [6]: df = pd.DataFrame(np.random.rand(5,2)) In [7]: df Out[7]: 0 1 0 0.514592 0.459589 1 0.329704 0.409099 2 0.061246 0.966191 3 0.336747 0.908513 4 0.169220 0.468437 In [8]: df.ix[0][0] = 1 In [9]: d
In [6]: df = pd.DataFrame(np.random.rand(5,2))
In [7]: df
Out[7]:
0 1
0 0.514592 0.459589
1 0.329704 0.409099
2 0.061246 0.966191
3 0.336747 0.908513
4 0.169220 0.468437
In [8]: df.ix[0][0] = 1
In [9]: df
Out[9]:
0 1
0 1.000000 0.459589
1 0.329704 0.409099
2 0.061246 0.966191
3 0.336747 0.908513
4 0.169220 0.468437
但在我这样做之后:
In [10]: df[0] = np.floor(df.index / 10).astype(int) * 10
In [11]: df
Out[11]:
0 1
0 0 0.459589
1 0 0.409099
2 0 0.966191
3 0 0.908513
4 0 0.468437
我找不到办法改变它
In [12]: df.ix[0][0] = 1
In [13]: df
Out[13]:
0 1
0 0 0.459589
1 0 0.409099
2 0 0.966191
3 0 0.908513
4 0 0.468437
我甚至不能更改其他列中的元素
In [16]: df.ix[0][1] = 1
In [17]: df
Out[17]:
0 1
0 0 0.459589
1 0 0.409099
2 0 0.966191
3 0 0.908513
4 0 0.468437
这是怎么回事?您正在编辑副本,请再试一次
In [3]: df = pd.DataFrame(np.random.rand(5,2))
In [4]: df[0] = np.floor(df.index / 10).astype(int) * 10
In [5]: df
Out[5]:
0 1
0 0 0.201611
1 0 0.390364
2 0 0.727422
3 0 0.941035
4 0 0.036764
In [6]: df.ix[0,1] = 1
In [7]: df
Out[7]:
0 1
0 0 1.000000
1 0 0.390364
2 0 0.727422
3 0 0.941035
4 0 0.036764
有趣的是,
.ix
是改变它的唯一方法吗?您知道为什么单独使用[colname]
访问列只会得到一个副本吗?[]
将数据帧中的行切片,请参见,colname访问是一种方便的功能,它将底层序列作为副本返回,请参见,但是为什么colname访问会使用输入8和10更改df
,在astype
赋值之前,如果colname access只返回一个副本,但在那之后(输入12和16)不改变df
。嗯,这可能只是取决于numpy想做什么。ix
将返回一个视图或副本,这取决于numpy,这实际上意味着内存中的布局是问题。在astype之前,这是一个数据类型,所以是一个内存块,所以你得到一个视图,在astype之后,一些东西被复制(通过numpy),所以你不能再得到一个视图,所以你得到一个副本,很奇怪,但它不提供“保证”。如果使用ix[row,col]=value
语法,可以避免整个问题(或者在0.11中,loc[row,col]
和iloc[row\u number,col\u number]
)