用numpy从genfromtxt中排除列

2024-04-20 11:53:20 发布

您现在位置:Python中文网/ 问答频道 /正文

是否可以使用genfromtxtnumpy库中排除所有字符串列?在

我有一个csv文件,其中包含来自机器学习网站的此类数据。在

antelope,1,0,0,1,0,0,0,1,1,1,0,0,4,1,0,1,1

目前在我的设置np.genfromtxt(path, dtype=float, names=None,delimiter=',')中,它将字符串标记为nan,这是有意义的,但我想排除所有字符串列。在

我知道有usecols=(1,2)参数,但这将要求我指定这个或我需要使用的每个数据集。我更喜欢“排除”方法而不是包含方法。在

我应该使用不同的方法还是自己处理每一行?在


Tags: 文件csv数据path方法字符串numpy机器
2条回答

pandas有一个DataFrame.select_dtypes方法,可以让您非常轻松地完成这项工作。您可以直接(如下例所示)或使用各种读取方法之一(例如,pd.read_csv())将数据获取到数据帧中:

In [21]: import pandas as pd

In [22]: df = pd.DataFrame({'a': [1,2,3,4,5], 'b': ['a','b','c','d','e'], 'c': [1.1, 2.2, 3.3, 4.4, 5.5]})

In [23]: df
Out[23]:
   a  b    c
0  1  a  1.1
1  2  b  2.2
2  3  c  3.3
3  4  d  4.4
4  5  e  5.5

In [24]: df.select_dtypes([int, float])
Out[24]:
   a    c
0  1  1.1
1  2  2.2
2  3  3.3
3  4  4.4
4  5  5.5

您可以在阅读后用nan过滤出列。在

In [52]: txt=b'antelope,1,0,0,1,0,0,0,1,1,1,0,0,4,1,0,1,1'
In [53]: txt=[txt,txt]
In [54]: A=np.genfromtxt(txt, dtype=float, names=None,delimiter=',')
In [55]: A
Out[55]: 
array([[ nan,   1.,   0.,   0.,   1.,   0.,   0.,   0.,   1.,   1.,   1.,
          0.,   0.,   4.,   1.,   0.,   1.,   1.],
       [ nan,   1.,   0.,   0.,   1.,   0.,   0.,   0.,   1.,   1.,   1.,
          0.,   0.,   4.,   1.,   0.,   1.,   1.]])

所有行中都有nan的列;或者我可以使用.any来表示任何{}的列。其他测试也可以。在

^{pr2}$

另一个想法是用dtype=None读取一次文件,让genfromtxt为每一列选择数据类型。可以对生成的复合数据类型进行筛选,以查找所需类型的列。在

In [118]: A=np.genfromtxt(txt, dtype=None, names=None,delimiter=',')
In [119]: ind=[i for i, d in enumerate(A.dtype.descr) if d[1]=='<i4']
In [120]: A=np.genfromtxt(txt, dtype=None, names=None,delimiter=',',usecols=ind) 
In [121]: A
Out[121]: 
array([[1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 4, 1, 0, 1, 1],
       [1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 4, 1, 0, 1, 1]])

还可以筛选数据类型以收集正确类型的列名

In [128]: A=np.genfromtxt(txt, dtype=None, names=None,delimiter=',')
In [129]: ind=[d[0] for d in A.dtype.descr if d[1]=='<i4']
In [130]: A[ind]
Out[130]: 
array([(1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 4, 1, 0, 1, 1),
       (1, 0, 0, 1, 0, 0, 0, 1, 1, 1, 0, 0, 4, 1, 0, 1, 1)], 
      dtype=[('f1', '<i4'), ('f2', '<i4'), ('f3', '<i4'), ('f4', '<i4'), ('f5', '<i4'), ('f6', '<i4'), ('f7', '<i4'), ('f8', '<i4'), ('f9', '<i4'), ('f10', '<i4'), ('f11', '<i4'), ('f12', '<i4'), ('f13', '<i4'), ('f14', '<i4'), ('f15', '<i4'), ('f16', '<i4'), ('f17', '<i4')])

虽然将这个结构化数组合并为一个具有单个dtype(int)的2d数组,但是有点麻烦(如果需要,我可以详细介绍)。在

相关问题 更多 >