使用NumPy时如何基于数据类型创建数据子集?

时间:2019-02-27 14:55:27

标签: python pandas numpy

目标:基于dtype生成原始数据的子集

如何使用NumPy基于dtypes创建列的子集。更具体地说,使用下面的示例,如何创建一个仅在新数据集中包含浮点值('<f8')的NumPy对象。

Example
--------
>>> df = pd.DataFrame({'A': [1, 2], 'B': [0.5, 0.75]},
...                   index=['a', 'b'])
>>> df
   A     B
a  1  0.50
b  2  0.75
>>> df.to_records()
rec.array([('a', 1, 0.5 ), ('b', 2, 0.75)],
          dtype=[('index', 'O'), ('A', '<i8'), ('B', '<f8')])

编辑: 我希望我可以利用以下内容:

np.where(my_np_array.dtype==[('int64')])

这将为我提供所有带有'<i8'的列,并排除上面示例中的所有'<f8'列。

1 个答案:

答案 0 :(得分:1)

我以前没有尝试过这种选择,但是让我们看一下复合dtype。

In [21]: M                                                                      
Out[21]: 
rec.array([('a', 1, 0.5 ), ('b', 2, 0.75)],
          dtype=[('index', 'O'), ('A', '<i8'), ('B', '<f8')])
In [22]: M.dtype.fields                                                         
Out[22]: 
mappingproxy({'index': (dtype('O'), 0),
              'A': (dtype('int64'), 8),
              'B': (dtype('float64'), 16)})

通过这种理解,我可以获得字段名称的列表:

In [23]: [f[0] for f in M.dtype.fields.items() if f[1][0]==np.int64]            
Out[23]: ['A']
In [24]: M[_]                                                                   
Out[24]: 
rec.array([(1,), (2,)],
          dtype={'names':['A'], 'formats':['<i8'], 'offsets':[8], 'itemsize':24})