2013-03-21 67 views
0

我可以改变数据框最初的第一个条目:np.array的astype是否会阻止DataFrame中的将来编辑?

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 

怎么了这种变化的元素?

回答

2

您正在编辑一个副本,尝试

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 
+1

有趣,所以是'.ix'改变它的唯一途径?你知道为什么用'[colname]'分开访问列只能提供一个副本吗? – beardc 2013-03-22 02:43:18

+0

''[]''对DataFrame中的行进行切片,请参阅http://pandas.pydata.org/pandas-docs/dev/indexing.html#basics,该名称访问是一种便利功能,它返回底层系列作为副本,请参阅http://pandas.pydata.org/pandas-docs/dev/basics.html#copying – Jeff 2013-03-22 13:40:02

+0

但是,为什么在'astype'赋值之前,colname访问会使用输入8和10更改'df',if colname访问只返回一个副本,但之后不会更改'df'(输入12和16)? – beardc 2013-03-22 15:14:28

相关问题