如何从python中没有特定列的数组中读取

时间:2013-01-28 08:46:30

标签: python numpy python-2.7 pandas data-analysis

我有一个numpy数组的dtype = object(实际上是各种数据类型的列表)。所以它创建了一个2D数组,因为我有一个列表数组(?)。我想复制每一行&只有这个数组的某些列到另一个数组。我从csv文件中将数据存储在此数组中。此csv文件包含多个字段(列)和大量行。这是我用来将数据存储到数组中的代码块。

data = np.zeros((401125,), dtype = object)
for i, row in enumerate(csv_file_object):
    data[i] = row

数据基本上可以描述如下

column1  column2  column3  column4  column5 ....
1         none     2       'gona'    5.3
2         34       2       'gina'    5.5
3         none     2       'gana'    5.1
4         43       2       'gena'    5.0
5         none     2       'guna'    5.7
.....     ....   .....      .....    ....
.....     ....   .....      .....    ....
.....     ....   .....      .....    ....

我想删除中间的不需要的字段。假设我不想要column3。 如何从阵列中仅删除该列?或者只将相关列复制到另一个数组?

3 个答案:

答案 0 :(得分:4)

使用pandas。在我看来,对于您的各种类型的数据,pandas.DataFrame可能更适合。

from StringIO import StringIO
from pandas import *
import numpy as np

data = """column1  column2  column3  column4  column5
1         none     2       'gona'    5.3
2         34       2       'gina'    5.5
3         none     2       'gana'    5.1
4         43       2       'gena'    5.0
5         none     2       'guna'    5.7"""

data = StringIO(data)
print read_csv(data, delim_whitespace=True).drop('column3',axis =1)

出:

   column1 column2 column4  column5
0        1    none  'gona'      5.3
1        2      34  'gina'      5.5
2        3    none  'gana'      5.1
3        4      43  'gena'      5.0
4        5    none  'guna'      5.7

如果您需要数组而不是DataFrame,请使用to_records()方法:

df.to_records(index = False)
#output:
rec.array([(1L, 'none', "'gona'", 5.3),
           (2L, '34', "'gina'", 5.5),
           (3L, 'none', "'gana'", 5.1),
           (4L, '43', "'gena'", 5.0),
           (5L, 'none', "'guna'", 5.7)], 
            dtype=[('column1', '<i8'), ('column2', '|O4'),
                   ('column4', '|O4'), ('column5', '<f8')])

答案 1 :(得分:3)

假设您正在读取CSV行并将其粘贴到numpy数组中,最简单和最佳的解决方案几乎肯定是在数据到达阵列之前对数据进行预处理,正如Maciek D.的回答所示。 (如果你想做一些比“删除第3列”更复杂的事情,你可能想要[value for i, value in enumerate(row) if i not in (1, 3, 5)]这样的东西,但想法仍然是一样的。)

但是,如果您已经导入了数组并且想要在事后进行过滤,那么您可能需要takedelete

>>> d=np.array([[1,None,2,'gona',5.3],[2,34,2,'gina',5.5],[3,None,2,'gana',5.1],[4,43,2,'gena',5.0],[5,None,2,'guna',5.7]])
>>> np.delete(d, 2, 1)
array([[1, None, gona, 5.3],
       [2, 34, gina, 5.5],
       [3, None, gana, 5.1],
       [4, 43, gena, 5.0],
       [5, None, guna, 5.7]], dtype=object)
>>> np.take(d, [0, 1, 3, 4], 1)
array([[1, None, gona, 5.3],
       [2, 34, gina, 5.5],
       [3, None, gana, 5.1],
       [4, 43, gena, 5.0],
       [5, None, guna, 5.7]], dtype=object)

对于“删除第3列”的简单情况,delete更有意义;对于更复杂的情况,take可能更有意义。

如果你还没有弄清楚如何首先导入数据,你可以使用内置的csv模块和Maciek D.的代码和流程,或者使用类似pandas.read_csv的内容并对结果进行后处理,如root的答案所示。

但最好先使用原生numpy数据格式而不是CSV。

答案 2 :(得分:1)

您可以使用范围选择。例如。要删除column3,您可以使用:

data = np.zeros((401125,), dtype = object)
for i, row in enumerate(csv_file_object):
    data[i] = row[:2] + row[3:]

这将起作用,假设csv_file_object产生列表。如果它是例如使用file创建的简单csv_file_object = open("file.cvs")对象,在循环中添加split

data = np.zeros((401125,), dtype = object)
for i, row in enumerate(csv_file_object):
    row = row.split()
    data[i] = row[:2] + row[3:]