如何使用genfromtxt加载包含字符串和数字的csv文件?

时间:2018-12-29 18:02:07

标签: python numpy genfromtxt

我正在尝试将Nspy文件中的csv文件加载到机器学习中。到目前为止,我一直都使用int或float数据,但是我当前的csv包含string,float和int,因此dtype参数存在一些麻烦。我的数据集有41188个样本和8个特征,例如:

header("Location:...")

我知道,如果我指定dtype = None,则类型将由各列的内容确定:

47;"university.degree";"yes";176;1;93.994;-36.4;4.857;"no"

,但显然不起作用。首先,genfromtxt的结果是一个具有以下形状的numpy ndarray:

data = np.genfromtxt(filename, dtype=None, delimiter=";", skip_header=1)

我希望(41188,8)

相反,如果我使用默认的dtype:

In [2]: data.shape
Out[2]: (41188,)

我获得以下形状的数据:

data2 = np.genfromtxt(filename, delimiter=";", skip_header=1)

第二,使用dtype = None,我收到以下弃用警告:

In [4]: data2.shape
Out[4]: (41188,8)

我可以通过使用来解决(对吗?):

VisibleDeprecationWarning: Reading unicode strings without specifying the encoding argument is deprecated. Set the encoding, use None for the system default.

我有2个问题:

  1. 如何设置每列的正确类型?
  2. 为什么必须设置编码?

1 个答案:

答案 0 :(得分:1)

带有两行示例行:

In [140]: data = np.genfromtxt(txt, dtype=None, delimiter=';', encoding=None)
In [141]: data
Out[141]: 
array([(47, '"university.degree"', '"yes"', 176, 1, 93.994, -36.4, 4.857, '"no"'),
       (47, '"university.degree"', '"yes"', 176, 1, 93.994, -36.4, 4.857, '"no"')],
      dtype=[('f0', '<i8'), ('f1', '<U19'), ('f2', '<U5'), ('f3', '<i8'), ('f4', '<i8'), ('f5', '<f8'), ('f6', '<f8'), ('f7', '<f8'), ('f8', '<U4')])
In [142]: data.shape
Out[142]: (2,)
In [143]: data.dtype
Out[143]: dtype([('f0', '<i8'), ('f1', '<U19'), ('f2', '<U5'), ('f3', '<i8'), ('f4', '<i8'), ('f5', '<f8'), ('f6', '<f8'), ('f7', '<f8'), ('f8', '<U4')])

这是一个普通的结构化数组-data是具有8个字段的一维数组。这些字段的dtype与每一列通用的浮点数,整数或字符串类型相匹配。

您通过名称而不是列号访问字段:

In [144]: data['f0']
Out[144]: array([47, 47])
In [145]: data['f1']
Out[145]: array(['"university.degree"', '"university.degree"'], dtype='<U19')

请注意,我包括了encoding=None。我不确定何时需要这样做,但很容易包含在内。