2017-07-25 2 views
1

Ich benutze numpy, um CSV-Datei zu lesen. Ich versuche, Bedingung hinzuzufügen, um die Aufzeichnungen von der csv Akte zusammenzubringen. meine Probe team_file wie dieses BelowWie benutze ich numpy wo finde ich mehrere Datensätze

43596,Team1,50,team1data,id1 
43597,Team2,51,team2data,id2 
43598,Team3,50,team2data,id2 

aussieht, ist der Code

import numpy as np 
reader = np.genfromtxt(team_file, delimiter=',', usecols=np.arange(1, 3), dtype=None) 

ich die column2 holen soll, wenn der column3 50. in diesem Beispiel Team1 und Team3 sollte die Ausgabe sein.

Ich möchte np.where ohne eine For-Schleife schreiben. Gibt es eine Möglichkeit, dies mit numpy zu erreichen? Ich kann keine Pandas benutzen. doing reader [0] [1] gibt mir den Wert als 50, aber wie erreiche ich es für alle Datensätze in der Datei? Schätzen Sie
jede Hilfe

+0

wirklich angezeigt haben sollte 'reader' für dieses Beispiel. Dann könnten wir antworten, ohne Ihren Fall neu zu erstellen. – hpaulj

Antwort

1
In [90]: txt=b"""43596,Team1,50,team1data,id1 
    ...: 43597,Team2,51,team2data,id2 
    ...: 43598,Team3,50,team2data,id2 
    ...: """ 
In [92]: data=np.genfromtxt(txt.splitlines(),delimiter=',',usecols=[1,3],dtype=None) 
In [93]: data 
Out[93]: 
array([[b'Team1', b'team1data'], 
     [b'Team2', b'team2data'], 
     [b'Team3', b'team2data']], 
     dtype='|S9') 

Kann nicht testen für '50'; kein solcher Wert irgendeines der "Usecols".


Wenn ich alle Spalten geladen werden, kann ich das dritte Feld testen für '50', wählen Sie die entsprechenden Datensätze:

In [94]: data=np.genfromtxt(txt.splitlines(),delimiter=',',dtype=None) 
In [95]: data 
Out[95]: 
array([(43596, b'Team1', 50, b'team1data', b'id1'), 
     (43597, b'Team2', 51, b'team2data', b'id2'), 
     (43598, b'Team3', 50, b'team2data', b'id2')], 
     dtype=[('f0', '<i4'), ('f1', 'S5'), ('f2', '<i4'), ('f3', 'S9'), ('f4', 'S3')]) 
In [96]: data['f2'] 
Out[96]: array([50, 51, 50]) 
In [97]: idx = np.where(data['f2']==50) 
In [98]: idx 
Out[98]: (array([0, 2], dtype=int32),) 
In [99]: data[idx] 
Out[99]: 
array([(43596, b'Team1', 50, b'team1data', b'id1'), 
     (43598, b'Team3', 50, b'team2data', b'id2')], 
     dtype=[('f0', '<i4'), ('f1', 'S5'), ('f2', '<i4'), ('f3', 'S9'), ('f4', 'S3')]) 
In [100]: data['f1'][idx] 
Out[100]: 
array([b'Team1', b'Team3'], 
     dtype='|S5') 

Korrektur. mit arange(1,3) statt [1,3] Spalten Sie wählen

In [102]: data=np.genfromtxt(txt.splitlines(),delimiter=',',usecols=np.arange(1, 
    ...: 3),dtype=None) 
In [103]: data 
Out[103]: 
array([(b'Team1', 50), (b'Team2', 51), (b'Team3', 50)], 
     dtype=[('f0', 'S5'), ('f1', '<i4')]) 
In [104]: idx = np.where(data['f1']==50) 
In [105]: data[idx] 
Out[105]: 
array([(b'Team1', 50), (b'Team3', 50)], 
     dtype=[('f0', 'S5'), ('f1', '<i4')]) 
+0

Danke Hpaul. Ich hätte die Daten zur Verfügung stellen können. Daten kommen als Array ([('Team1', 50), ('Team2', 51), ('Team3', 50)]). Ich kann nicht alle Spalten in der Datei verwenden, da in jeder Zeile keine feste Anzahl von Spalten vorhanden ist. Einige Zeilen können 5 Spalten haben und die andere kann 10 Spalten haben. Aber ich interessiere mich für die zweite und dritte Spalte. Und ich möchte Team1 und Team3 zurückgeben, wo die zweite Spalte mit 50 übereinstimmt. – user2406718

+0

Etwas wie unten scheint zu funktionieren. Die Werte f1 und f2 können jedoch unterschiedliche Zeichenlängen haben. Ich habe bemerkt, dass S9 die ersten 9 Zeichen nehmen sollte. aber ich möchte die gesamte zweite und dritte Spalte unabhängig von der Anzahl der Zeichen nehmen. data = genfromtxt ('team_file', delimiter = ',', usecols = np.bereich (1,3), dtype = [('f1', 'S9'), ('f2', ' user2406718

+0

Ich habe es funktioniert. Ihre Antwort hat geholfen, also habe ich als richtige Antwort markiert. Ich kann 'f1', S20 'definieren. 20 Zeichen ist die max. Es hat damit funktioniert. data = genfromtxt ('teamdatei', delimiter = ',', usecols = np.bereich (1,3), dtype = [('f1', 'S20'), ('f2', 'int32')], skip_header = 1) dann heißt es wie data [np.where (data ['f2'] == 50)] ['f1'] – user2406718