使用掩码数组创建 pandas DataFrame
using masked array to create pandas DataFrame
我认为我得到了以下行为 b/c 我的输入数组被屏蔽了,我很难理解这一点。我一直在查看 this pandas doc on gotchas,但不确定 "sentinel" 值是什么。它只是在创建随后设置为 NULL 的 DataFrame 期间使用的类似“-9999”的东西吗?
在制作 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)
我不确定这是 "best-est" 的方法,但我使用 numpy.ma.filled()
函数(options listed in this doc).
[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'] = ''
segArrNew
中每个字段的 fill_value
用于制作输出 DataFrame。我使用 df.ix() 替换了被屏蔽的填充标记。
我认为我得到了以下行为 b/c 我的输入数组被屏蔽了,我很难理解这一点。我一直在查看 this pandas doc on gotchas,但不确定 "sentinel" 值是什么。它只是在创建随后设置为 NULL 的 DataFrame 期间使用的类似“-9999”的东西吗?
在制作 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)
我不确定这是 "best-est" 的方法,但我使用 numpy.ma.filled()
函数(options listed in this doc).
[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'] = ''
segArrNew
中每个字段的 fill_value
用于制作输出 DataFrame。我使用 df.ix() 替换了被屏蔽的填充标记。