2015-02-11 75 views
4

思考我得到以下行爲B/C我的輸入數組被屏蔽,我很難理解。我一直在尋找this pandas doc on gotchas,但不確定什麼是「哨兵」值。它是否就像在創建DataFrame期間使用的「-9999」,隨後將其設置爲NULL?使用蒙版陣列來創建熊貓數據幀

製作DataFrame時處理這些值的好方法是什麼?如果掩碼條目設置爲NULL,我很高興。

下面是一個例子:

[Dbg]>>> segDF = pd.DataFrame(segArrNew) 
Traceback (most recent call last): 
    File "<interactive input>", line 1, in <module> 
    File "C:\Anaconda\envs\esri\Lib\site-packages\pandas\core\frame.py", line 393, in __init__ 
    datacopy[mask] = NA 
    File "C:\Python27\ArcGIS10.2\lib\site-packages\numpy\ma\core.py", line 3027, in __setitem__ 
    ndarray.__setitem__(_data, indx, dval) 
IndexError: arrays used as indices must be of integer (or boolean) type 

[Dbg]>>> segArrNew 
masked_array(data = [(1, u'01', 1, --) (2, u'01', 2, --) (3, u'01', 3, --) ..., 
(56853, u'21', 241, --) (56854, u'21', 242, --) (56855, u'21', 243, --)], 
      mask = [(False, False, False, True) (False, False, False, True) 
(False, False, False, True) ..., (False, False, False, True) 
(False, False, False, True) (False, False, False, True)], 
     fill_value = (999999, u'N/A', 999999, u'N/A'), 
      dtype = [('seg_id_nat', '<i4'), ('region', '<U255'), ('seg_id_reg', '<i4'), ('refGage', '<U30')]) 

你可以看到,該陣列被屏蔽,一些前幾排的顯示在那裏的--例子。所以我放棄了最後一個字段(refGage),它起作用,所以我認爲它是隻在該字段中出現的掩碼值。

[Dbg]>>> segArrNew2 = npFuncs.drop_fields(segArrNew, ['refGage']) 
[Dbg]>>> segDF = pd.DataFrame(segArrNew2) 
[Dbg]>>> segDF 
<class 'pandas.core.frame.DataFrame'> 
Int64Index: 57186 entries, 0 to 57185 
Data columns: 
seg_id_nat 57186 non-null values 
region  57186 non-null values 
seg_id_reg 57186 non-null values 
dtypes: int64(2), object(1) 
+0

http://pandas.pydata.org/pandas-docs/stable/dsintro.html#from-a-series – 2016-04-20 19:23:23

回答

1

我不知道這是「最好的-EST」的方式來做到這一點,但我使用numpy.ma.filled()功能(options listed in this doc)轉換的屏蔽數組到正規numpy.ndarray

[Dbg]>>> np.ma.filled(segArrNew) 
array([(1, u'01', 1, u'N/A'), (2, u'01', 2, u'N/A'), (3, u'01', 3, u'N/A'), 
     ..., (56853, u'21', 241, u'N/A'), (56854, u'21', 242, u'N/A'), 
     (56855, u'21', 243, u'N/A')], 
     dtype=[('seg_id_nat', '<i4'), ('region', '<U255'), ('seg_id_reg', '<i4'), ('refGage', '<U30')]) 

[Dbg]>>> df = pandas.DataFrame(numpy.ma.filled(segArrNew)) 
[Dbg]>>> df.ix[df['refGage'] == u'N/A'], 'refGage'] = '' 

segArrNewfill_value每個字段在使輸出數據幀被施加。我使用df.ix()來替換被掩蓋的內容的填充令牌。