2014-05-09 24 views
1

我在熊貓數據框中發現奇怪的值賦值限制。這裏有一個簡單的例子python:pandas.dataframe.values not chaning

from __future__ import print_function 
    from pandas import DataFrame 
    import numpy as np 

    data=DataFrame({'one':[1,2],'two':[3.0,4]}) 
    data.values[1,1]=data.values[1,1]*6 # these are type<numpyfloat64> 
    print(data.values[1,1]) 
    #still returns 4.0 instead of expected 24.0 

我很感激爲什麼會發生這種情況的解釋。

回答

4

當訪問一個NDFrame對象的屬性values,收到數組,它是在它的類型均勻。也就是說,values返回單個數組dtype,這是DataFrame中列的dtype中的最大精度。在你的情況下,oneint64dtypetwofloat64。當您撥打電子郵件values時,最終會發生concatenate風格的操作,並且這些操作始終會返回一個副本,這就是爲什麼您不能分配給它並查看數據中的副作用。

+0

低調選民的照顧評論? –

0

data.values是一個單獨的數組,不是對原始對象的引用。它只是從data中讀取數據。是的,它不會更改原始值,因爲它不代表它們,它基本上是它們的副本。

直接改變值,可使用loc

data.loc[1, 'one'] *= 6 
+1

'data ['one'] [1] * = 6'可能總是工作,也可能不總是工作。請參閱[鏈接](http://pandas.pydata.org/pandas-docs/dev/indexing.html#returning-a-view-versus-a-copy)一種更安全的方法是'data.ix [1,'one '] * = 6' – Happy001

+0

@ Happy001哦,哇,不知道這一點。將相應地編輯答案。 – sashkello

0

根據the documentation of Pandas

屬性的值本身,不像軸標籤,不能被分配給。

因此這是預期的行爲。以下代碼是更改值的一種方法。

data.two[1] = data.two[1] * 6