从CSV导入时的Numpy数组

时间:2016-04-04 13:27:53

标签: python csv numpy

我遇到了问题而且我不知道如何处理它。

我有这样的CSV文件:

0.3,36.22683698,-115.0466482,1836.255238,0,0,0.2105903662,0.6848089322,41.15086807,2016/3/26,4:35:51
0.6,36.22683698,-115.0466482,1836.255238,0,0,0.2105903662,0.6848089322,41.15086807,2016/3/26,4:35:51
0.9,36.22683698,-115.0466482,1836.255238,0,0,0.2105903662,0.6848089322,41.15086807,2016/3/26,4:35:51

正如您所看到的,首先我有9个浮点值,然后另外2个我想加载为字符串。分隔符=,

当我使用时:

load = np.genfromtxt(str(path), delimiter=',')
print load[0,4]

它从第0行第4列打印值,它可以正常工作。数据已正确加载。但是有一个问题,因为最后2个值是nan

print load[0,10]
>>nan

当我将代码更改为:

load = np.genfromtxt(str(path), delimiter=',',dtype=None)

我收到错误:

  

打印负载[0,4]
  IndexError:数组

的索引太多

除非我添加dtype=None

,否则一切正常

我做错了什么?

3 个答案:

答案 0 :(得分:2)

您无法使用多个dtype创建numpy数组。您必须使用dtype=str

导入csv
import numpy as np
load = np.genfromtxt(str(path), delimiter=',',dtype=str)

使用dtype=None,它会创建一个形状为(3,)的numpy数组。因此,您无法致电load[0, 4]

每个条目都是包含数据的元组。因为元组可以包含几种类型。

也许出于您的目的,您必须使用熊猫:

import pandas as pd
load = pd.read_csv(str(path), header=None)

输出如下:

0          1           2            3   4   5        6         7   \
     

0 0.3 36.226837 -115.046648 1836.255238 0 0 0.21059 0.684809
  1 0.6 36.226837 -115.046648 1836.255238 0 0 0.21059 0.684809
  2 0.9 36.226837 -115.046648 1836.255238 0 0 0.21059 0.684809

     8          9        10  
     

0 41.150868 2016/3/26 4:35:51
  1 41.150868 2016/3/26 4:35:51
  2 41.150868 2016/3/26 4:35:51

每列都有pandas推断的dtype

答案 1 :(得分:1)

对此案例应用较早的genfromtxt答案:

txt="""0.3,36.22683698,-115.0466482,1836.255238,0,0,0.2105903662,0.6848089322,41.15086807,2016/3/26,4:35:51
... ..."""
>>> load=np.genfromtxt(txt.splitlines(),dtype=None,delimiter=',')
>>> load.shape
(3,)
>>> load.dtype
dtype([('f0', '<f8'), ('f1', '<f8'), ('f2', '<f8'), ('f3', '<f8'), ('f4', '<i4'), ('f5', '<i4'), ('f6', '<f8'), ('f7', '<f8'), ('f8', '<f8'), ('f9', 'S9'), ('f10', 'S7')])

形状是1d,但是dtype是复合的,浮动,整数和字符串的混合 - 其中11个。

>>> load[0]
(0.3, 36.22683698, -115.0466482, 1836.255238, 0, 0, 0.2105903662, 0.6848089322, 41.15086807, '2016/3/26', '4:35:51')
>>> load['f0']
array([ 0.3,  0.6,  0.9])

'rows'或记录按编号访问,但'columns'现在是字段,并按名称访问(您也可以从csv列标题中获取名称,这里它们会自动生成)。

>>> load[0]['f4']
0
>>> load[0]['f3']
1836.255238

单个元素可以通过数字和名称的组合进行访问。

这种结构化数组格式的缺点是跨列进行数学运算的能力有限。解决这个问题的方法是将列分组到另一层复合中。

使用这些数据,我可以定义5个字段,即float,int和string的混合:

>>> dt=np.dtype('(4)float,(2)int,(3)float,S10,S10')
>>> dt
dtype([('f0', '<f8', (4,)), ('f1', '<i4', (2,)), ('f2', '<f8', (3,)), ('f3', 'S10'), ('f4', 'S10')])
>>> load=np.genfromtxt(txt.splitlines(),dtype=dt,delimiter=',')

现在第一个字段是(3,4)数组:

>>> load['f0']
array([[  3.00000000e-01,   3.62268370e+01,  -1.15046648e+02,
          1.83625524e+03],
       [  6.00000000e-01,   3.62268370e+01,  -1.15046648e+02,
          1.83625524e+03],
       [  9.00000000e-01,   3.62268370e+01,  -1.15046648e+02,
          1.83625524e+03]])
>>> load['f1']
array([[0, 0],
       [0, 0],
       [0, 0]])

dt=np.dtype('(9)float,S10,S10')也可以工作,因为2个int列可以作为浮点数加载。

最后2列可以加载为np.datetime64,但用逗号分隔它们可能会使步骤复杂化。

这些9个数字列可以从pandas加载提取到numpy浮点数组中,其中包含:

pload.values[:,:9].astype(float)
pload.as_matrix(range(9))

答案 2 :(得分:0)

您需要在Ext.application({ name: 'ExtJSApp', launch: function () { Ext.create('Ext.grid.Panel', { renderTo: Ext.get('dvGrid'), store: billDStore, width: 1300, height: 200, title: 'dfssdf', columns: [ { text: 'SlNo', width: 20, sortable: false, hideable: false, dataIndex: 'SlNo' }, { text: 'Bill No', width: 20, dataIndex: 'BillNo', hidden: true }, { text: 'ItemCode', width: 50, dataIndex: 'ItemCode' }, { text: 'Description', width: 150, dataIndex: 'Desc' }, { text: 'Quantity', width: 100, dataIndex: 'Qty' }, { text: 'Rate', width: 100, dataIndex: 'Rate' }, { text: 'Discount Percent', width: 100, dataIndex: 'DiscPercent' }, { text: 'Discount Amount', width: 100, dataIndex: 'DiscAmt' }, { text: 'Amount', width: 100, dataIndex: 'Amount' } ] }); } }); 中添加名称= True。genfromtxt returning NaN rows上有类似问题

看看那里