2016-10-22 64 views
3

我有個製表符分隔的CSV數據集numpy的陣列如下:讀製表符分隔的csv成具有不同的數據類型

1  2  3  4  5  6  [0, 1, 2, 3, 4, 5] 
3  1  2  6  4  5  [2, 0, 1, 5, 3, 4] 
7  8  9  10  11  6  [0, 1, 2, 3, 4, 5] 
10  11  9  8  7  6  [3, 4, 2, 1, 0, 5] 
12  13  4  14  15  6  [0, 1, 2, 3, 4, 5] 
13  4  14  12  15  6  [1, 2, 3, 0, 4, 5] 
16  17  18  19  20  6  [0, 1, 2, 3, 4, 5] 
6  18  20  17  16  19  [5, 2, 4, 1, 0, 3] 
7  21  22  23  24  6  [0, 1, 2, 3, 4, 5] 
23  6  21  7  22  24  [3, 5, 1, 0, 2, 4] 
25  7  21  22  23  6  [0, 1, 2, 3, 4, 5] 
6  21  7  22  25  23  [5, 2, 1, 3, 0, 4] 
16  26  3  27  28  6  [0, 1, 2, 3, 4, 5] 
26  6  27  3  28  16  [1, 5, 3, 2, 4, 0] 
7  29  24  30  31  6  [0, 1, 2, 3, 4, 5] 
30  24  6  7  29  31  [3, 2, 5, 0, 1, 4] 
32  33  13  34  35  36  [0, 1, 2, 3, 4, 5] 
34  32  36  35  13  33  [3, 0, 5, 4, 2, 1] 
7  37  38  39  40  6  [0, 1, 2, 3, 4, 5] 
39  38  40  6  37  7  [3, 2, 4, 5, 1, 0] 
7  41  42  43  44  6  [0, 1, 2, 3, 4, 5] 
41  6  44  43  42  7  [1, 5, 4, 3, 2, 0] 
7  45  46  47  48  6  [0, 1, 2, 3, 4, 5] 
6  47  45  7  46  48  [5, 3, 1, 0, 2, 4] 
49  2  50  51  52  6  [0, 1, 2, 3, 4, 5] 

當我想要導入這樣csv文件到一個numpy的陣列如下;

dataset = numpy.loadtxt('dataset/demo_dataset.csv', delimiter='\t', dtype='str') 

我用(25,)形狀獲得了一個numpy數組。

我要導入該csv文件分爲兩個numpy的數組,稱爲X和Y

X將包括第6列,和Y將包括最後一列的列表值,而不是海峽。

我該如何管理它?

+0

很容易將6列加載爲整數,最後一列加載爲字符串。 'dtype = None'應該這樣做,或者是一個更加自由的習慣dtype。但'']'字符串需要特殊處理,不論是在'genfromtxt'還是之後。 – hpaulj

回答

3

我管理只能通過自定義的方法來實現這一目標:

import numpy 

with open('dataset/demo_dataset.csv', 'r') as fin: 
    lines = fin.readlines() 
    # remove '\n' characters 
    clean_lines = [l.strip('\n') for l in lines] 
    # split on tab so that we get lists from strings 
    A = [cl.split('\t') for cl in clean_lines] 
    # get lists of ints instead of lists of strings 
    X = [map(int, row[0:6]) for row in A] 
    # last column in Y 
    Y = [row[6] for row in A] 

    # convert string to int values 
    for i in xrange(len(Y)): 
     Y[i] = map(int, Y[i].strip('[]').split(',')) 
1

如果使用pandas,有來讀取數據的(可以說)更簡單的方法首先,pandas.DataFrame實例可以構建和我們可以將一個自定義功能的最後一列字符串元素轉換爲np.ndarray類型:

import pandas as pd 
import numpy as np 

df = pd.read_table('dataset/demo_dataset.csv', delimiter='\t', names='abcdefg') 
convert = lambda a: np.fromstring(a[1:-1], count = a.count(',') + 1, sep = ', ', dtype=int) 
df.g = df.g.apply(convert) 

一旦混合數據幀構造,XY可離牙牙在簡單的方式排列:

X = df.values[:, :-1].astype(int) 
Y = np.vstack(df.values[:, -1]) 
1

一些選項使用genfromtxt

In [1047]: txt=b"""7\t8\t9\t10\t11\t6\t [0, 1, 2, 3, 4, 5]""" 
In [1048]: txt=[txt,txt,txt] 
In [1049]: txt 
Out[1049]: 
[b'7\t8\t9\t10\t11\t6\t [0, 1, 2, 3, 4, 5]', 
b'7\t8\t9\t10\t11\t6\t [0, 1, 2, 3, 4, 5]', 
b'7\t8\t9\t10\t11\t6\t [0, 1, 2, 3, 4, 5]'] 

負荷爲默認的花車 - 最後一列是nan

In [1050]: np.genfromtxt(txt,delimiter='\t') 
Out[1050]: 
array([[ 7., 8., 9., 10., 11., 6., nan], 
     [ 7., 8., 9., 10., 11., 6., nan], 
     [ 7., 8., 9., 10., 11., 6., nan]]) 

由於串

In [1051]: np.genfromtxt(txt,delimiter='\t',dtype='str') 
Out[1051]: 
array([['7', '8', '9', '10', '11', '6', ' [0, 1, 2, 3, 4, 5]'], 
     ['7', '8', '9', '10', '11', '6', ' [0, 1, 2, 3, 4, 5]'], 
     ['7', '8', '9', '10', '11', '6', ' [0, 1, 2, 3, 4, 5]']], 
     dtype='<U19') 

讓它決定最合適的結果 - 結果是一個結構化數組,其中包含int字段和一個字符串字段。

In [1052]: np.genfromtxt(txt,delimiter='\t',dtype=None) 
Out[1052]: 
array([(7, 8, 9, 10, 11, 6, b' [0, 1, 2, 3, 4, 5]'), 
     (7, 8, 9, 10, 11, 6, b' [0, 1, 2, 3, 4, 5]'), 
     (7, 8, 9, 10, 11, 6, b' [0, 1, 2, 3, 4, 5]')], 
     dtype=[('f0', '<i4'), ('f1', '<i4'), ('f2', '<i4'), ('f3', '<i4'), ('f4', '<i4'), ('f5', '<i4'), ('f6', 'S19')]) 
In [1053]: _['f6'] 
Out[1053]: 
array([b' [0, 1, 2, 3, 4, 5]', b' [0, 1, 2, 3, 4, 5]', 
     b' [0, 1, 2, 3, 4, 5]'], 
     dtype='|S19') 

細化D型細胞 - 一個字段具有6列,其它的字符串:

In [1055]: np.genfromtxt(txt,delimiter='\t',dtype='6int,S20') 
Out[1055]: 
array([([7, 8, 9, 10, 11, 6], b' [0, 1, 2, 3, 4, 5]'), 
     ([7, 8, 9, 10, 11, 6], b' [0, 1, 2, 3, 4, 5]'), 
     ([7, 8, 9, 10, 11, 6], b' [0, 1, 2, 3, 4, 5]')], 
     dtype=[('f0', '<i4', (6,)), ('f1', 'S20')]) 

第一個字段是你所需X;在最後一個字段中的字符串需要進一步加工(根據您的其他問題):

In [1060]: _['f0'] 
Out[1060]: 
array([[ 7, 8, 9, 10, 11, 6], 
     [ 7, 8, 9, 10, 11, 6], 
     [ 7, 8, 9, 10, 11, 6]]) 
In [1061]: __['f1'] 
Out[1061]: 
array([b' [0, 1, 2, 3, 4, 5]', b' [0, 1, 2, 3, 4, 5]', 
     b' [0, 1, 2, 3, 4, 5]'], 

這最後一個字段可以轉換爲@chefarov確實與Y變量。

回想一下,我可以用另一個電話來處理該字符串字段,以genfromtxt。我仍然需要刪除[]

In [1101]: data=np.genfromtxt(txt,delimiter='\t',dtype='6int,S20') 
In [1102]: data['f1'] 
Out[1102]: 
array([b'[0, 1, 2, 3, 4, 5]', b'[0, 1, 2, 3, 4, 5]', b'[0, 1, 2, 3, 4, 5]'], 
     dtype='|S20') 
In [1103]: np.genfromtxt([l.strip(b'[]') for l in data['f1']],delimiter=',',dtype=int) 
Out[1103]: 
array([[0, 1, 2, 3, 4, 5], 
     [0, 1, 2, 3, 4, 5], 
     [0, 1, 2, 3, 4, 5]]) 

我建議,在其他情況下,預處理線,除去引號,括號和問題分隔符。 genfromtxt接受任何來自它的行的輸入。但在這種情況下,所需處理大部分是@chefarov建議的 - 減去int轉換。

genfromtxt也接受轉換器,但我在其他問題中發現轉換器不能將一個字段更改爲多個字段。

另外genfromtxt在文件行上迭代,並解碼每個文件並收集列表中的值。所以它對自定義閱讀器沒有任何速度優勢。

相關問題