2016-03-18 11 views
0

Kann man alle String-Spalten mit genfromtxt aus der Bibliothek numpy ausschließen?Spalten von genfromtxt mit numpy ausschließen

Ich habe dies eine CSV-Datei mit dieser Art von Daten von der Machine Learning Website.

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

Zeit mit meinen Einstellungen np.genfromtxt(path, dtype=float, names=None,delimiter=',') es markiert die Zeichenfolge als nan was Sinn macht, aber ich möchte alle Spalten ausschließen, die Zeichenfolge sind.

Ich weiß, dass es den usecols=(1,2) Parameter gibt, aber das würde erfordern, dass ich diesen oder jeden Datensatz angeben muss, den ich verwenden muss. Ich bevorzuge eher eine "Ausschluss" -Methode als die Einschlussmethode.

Sollte ich eine andere Methode verwenden oder oder jede Zeile von mir selbst verarbeiten?

+0

Gibt es einen bestimmten Grund, warum Sie 'genfromtxt' verwenden müssen? Dies ist ein recht unkomplizierter Anwendungsfall mit einem [Pandas] (http://pandas.pydata.org/) DataFrame. –

+0

Nein, ich bin nicht von Bibliotheken geboxt. Wie würdest du es in Panda machen? – lzc

Antwort

1

Pandas hat eine DataFrame.select_dtypes Methode, mit der Sie das ganz einfach machen können. Sie können die Daten in einen Datenrahmen erhalten entweder direkt (wie im Beispiel unten), oder eine der verschiedenen Lesemethoden unter Verwendung von (zum Beispiel 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 
1

Sie Spalt herausfiltern könnten mit nan nach der Lektüre.

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.]]) 

Spalten mit nan in allen Zeilen; oder ich könnte .any für Spalten mit allen nan verwenden. Andere Tests sind möglich.

In [56]: ind=np.isnan(A).all(axis=0) 
In [57]: ind 
Out[57]: 
array([ True, False, False, False, False, False, False, False, False, 
     False, False, False, False, False, False, False, False, False], dtype=bool) 
In [58]: A[:,~ind] 
Out[58]: 
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.]]) 

Eine weitere Idee ist es, die Datei einmal mit dtype=None zu lesen, lassen genfromtxt die dtype für jede Spalte wählen. Die resultierende Verbindung dtype kann Filter sein, um die Spalten des gewünschten Typs zu finden.

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]]) 

Die dtype auch gefiltert werden können Spaltennamen zu sammeln, dass die richtigen Art sind

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')]) 

Obwohl mit einem einzelnen dtype (int) dieses strukturierte Array in eine 2D-Array zu konsolidieren, ist ein bisschen ein Schmerz (ich könnte bei Bedarf in die Details gehen).

Verwandte Themen