2016-09-29 1 views
1

Ich habe diese ziemlich große CSV-Datei, und ich interessiere mich nur für die Zeilen, die das Wort "Slave" enthalten ... Einige Zeilen, die Slave enthalten sind nicht genau die gleichen wie andere, aber sie alle enthält das Wort "Slave".CSV-Filter für numpy

Ich möchte alle anderen Zeilen wegwerfen und dann an den Daten arbeiten, die in der anderen Spalte übrig geblieben sind.

Hier ist der Haken: Die andere Säule ist nicht sauber entweder ... Es sieht immer so, aber:

digit (text) so zum Beispiel:

7 (medium)

12 (strong)

Ich möchte die ersten 1 oder 2 (abhängig davon, ob es 1 oder 2 Ziffern, natürlich) und dann plotten sie in einem Histogramm mit numpy und matplotlib/pyplot.

Ich habe zwei Probleme bekam:
Dieser Code:

import csv 
x=csv.reader(open('sample.csv', 'rt'), delimiter=',') 
x=list(x) 

Ist in Ordnung, aber jetzt habe ich Dinge wie x[1][1] Adresse ... Diese

Slave (0x00-02-5b-00-a5-a5) (#1) 

aber zeigen, etwas wie x[:][1] zeigt

['6 (medium)', 'Slave (0x00-02-5b-00-a5-a5) (#1)'] 

Was ich nicht erwarte ... Ich würde erwarten, dass es nur die zweite Spalte druckt.

Wie auch immer, wenn ich über das hinaus komme, wird das nächste Problem sein, dass die überlebende Spalte einige Zeichenfilter haben wird, um die Ziffern zu behalten und die Alpha-Zeichen zu entfernen. Ich habe Angst davor, genau das zu tun und in der Lage zu sein, in eine nüchterne freundliche Datenstruktur einzusteigen.

Irgendwelche Gedanken zum weiteren Vorgehen? Hier ist ein Beispiel der Daten Ich arbeite mit:

6 (medium),Slave (0x00-02-5b-00-a5-a5) (#1) 
7 (medium),Slave (0x00-02-5b-00-a5-a5) (#1) 
6 (medium),Slave (0x00-02-5b-00-a5-a5) (#1) 
6 (medium),Slave (0x00-02-5b-00-a5-a5) (#1) 
7 (medium),Slave (0x00-02-5b-00-a5-a5) (#1) 
6 (medium),Slave (0x00-02-5b-00-a5-a5) (#1) 
6 (medium),Slave (0x00-02-5b-00-a5-a5) (#1) 
6 (medium),Slave (0x00-02-5b-00-a5-a5) (#1) 
7 (medium),Slave (0x00-02-5b-00-a5-a5) (#1) 
7 (medium),Slave (0x00-02-5b-00-a5-a5) (#1) 
5 (medium),Slave (0x00-02-5b-00-a5-a5) (#1) 
5 (medium),Slave (0x00-02-5b-00-a5-a5) (#1) 
7 (medium),Slave (0x00-02-5b-00-a5-a5) (#1) 
6 (medium),Slave (0x00-02-5b-00-a5-a5) (#1) 
6 (medium),Slave (0x00-02-5b-00-a5-a5) (#1) 
7 (medium),Slave (0x00-02-5b-00-a5-a5) (#1) 
4 (weak),Slave (0x00-02-5b-00-a5-a5) (#1) 
6 (medium),Slave (0x00-02-5b-00-a5-a5) (#1) 
7 (medium),Slave (0x00-02-5b-00-a5-a5) (#1) 
6 (medium),Slave (0x00-02-5b-00-a5-a5) (#1) 
7 (medium),Slave (0x00-02-5b-00-a5-a5) (#1) 
5 (medium),Slave (0x00-02-5b-00-a5-a5) (#1) 
7 (medium),Slave (0x00-02-5b-00-a5-a5) (#1) 
6 (medium),Slave (0x00-02-5b-00-a5-a5) (#1) 
5 (medium),Slave (0x00-02-5b-00-a5-a5) (#1) 
6 (medium),Slave (0x00-02-5b-00-a5-a5) (#1) 
4 (weak),Slave (0x00-02-5b-00-a5-a5) (#1) 
6 (medium),Slave (0x00-02-5b-00-a5-a5) (#1) 
6 (medium),Slave (0x00-02-5b-00-a5-a5) (#1) 
13 (strong),Master (0x00-25-52-f5-a6-f1) (#1) 
7 (medium),Slave (0x00-02-5b-00-a5-a5) (#1) 
10 (strong),Master (0x00-25-52-f5-a6-f1) (#1) 
6 (medium),Slave (0x00-02-5b-00-a5-a5) (#1) 
11 (strong),Master (0x00-25-52-f5-a6-f1) (#1) 
6 (medium),Slave (0x00-02-5b-00-a5-a5) (#1) 
8 (medium),Master (0x00-25-52-f5-a6-f1) (#1) 
7 (medium),Slave (0x00-02-5b-00-a5-a5) (#1) 
13 (strong),Master (0x00-25-52-f5-a6-f1) (#1) 
12 (strong),Master (0x00-25-52-f5-a6-f1) (#1) 
7 (medium),Slave (0x00-02-5b-00-a5-a5) (#1) 
10 (strong),Master (0x00-25-52-f5-a6-f1) (#1) 
5 (medium),Slave (0x00-02-5b-00-a5-a5) (#1) 
11 (strong),Master (0x00-25-52-f5-a6-f1) (#1) 
4 (weak),Slave (0x00-02-5b-00-a5-a5) (#1) 
13 (strong),Master (0x00-25-52-f5-a6-f1) (#1) 
5 (medium),Slave (0x00-02-5b-00-a5-a5) (#1) 
11 (strong),Master (0x00-25-52-f5-a6-f1) (#1) 
6 (medium),Slave (0x00-02-5b-00-a5-a5) (#1) 
11 (strong),Master (0x00-25-52-f5-a6-f1) (#1) 
13 (strong),Master (0x00-25-52-f5-a6-f1) (#1) 
7 (medium),Slave (0x00-02-5b-00-a5-a5) (#1) 
10 (strong),Master (0x00-25-52-f5-a6-f1) (#1) 

Dank

+0

Die Liste Verständnis kann wie so in eine äquivalente Schleife erweitert werden Warte, warum taub? Als csv enthält jede Zeile zwei Spalten, eine vor und nach dem Komma. 'x [1] [1]' ist die zweite Spalte aus der zweiten Liste, da Python 0-basierte Indizes verwendet. Und 'x [:] [1]' ist äquivalent zu 'x [1]', also keine Überraschung. –

+0

so 'Slave (0x00-02-5b-00-a5-a5) (# 1)' wird was? –

+0

Ich bin bereit, auf numpy zu verzichten ... Ich dachte, es würde sich auszahlen, wenn ich Plotten machen würde. Ich bin immer noch daran fest, wie man die Filterung der Zeichenkette 'Slave' an dieser Stelle anspricht. Können Sie näher erläutern, warum die beiden Syntaxen gleich sind und wo meine Annahmen falsch sind? – testname123

Antwort

1

Als csv, jede Zeile enthält zwei Spalten, eine vor und eine nach dem Komma. x[1][1] ist die zweite Spalte aus der zweiten Liste, da Python 0-basierte Indizes verwendet. Und x[:][1] entspricht x[1], also keine Überraschung. wenn Sie es wünschen,

firstcol_arr = np.array(firstcol_filt) 

firstcol_filt = [int(str.split(k[0])[0]) for k in x if 'Slave' in k[1]] 

dann können Sie verwandeln diese Liste der Listen in eine numpy Array Aufgrund:

Ich schlage vor, Filterung und die erste Spalte zu halten, die Ihre Zahlen enthält Seine Form ist ein 1d-Array, das Sie in einem Histogramm verwenden können.


einfach zu erarbeiten: x aus Ihrer CSV ist eine Liste von Listen.Das Listenverständnis umfasst Schleifen über x, k ist jede Zeile der CSV, also k ist eine Zwei-Elemente-Liste. Wenn 'Slave' im zweiten Element ist, teilen wir das erste Element in Leerzeichen und transformieren seinen ersten Teil in eine Ganzzahl.

firstcol_filt = [] 
for k in x: 
    if 'Slave' in k[1]: 
     firstcol_filt.append(int(str.split(k[0])[0])) 

Da Sie in einem Kommentar gefragt, hier ist der Filterschritt und der Teilungsschritt getrennt, für Klarheit:

filtered_rows = [k for k in x if 'Slave' in k[1]] 
firstcol_filt = [int(str.split(k[0])[0]) for k in filtered_rows] 
+0

Wow ... toller Liner ... Um sicherzugehen, dass ich das richtig verstanden habe, machen die Klammern "k" besonders ... Ich habe bemerkt, dass es nicht definiert wurde, bevor es mit 'for' aufgerufen wurde. Warum wirft "int" auch keinen Fehler, wenn man versucht, 'k' zu teilen, bevor es definiert ist? Und ist es trivial, die anfängliche Filterung zu drucken, um sicherzustellen, dass nur "Slave" -Reihen bleiben dürfen? – testname123

+0

@BrocolliRob Die Klammern mit 'k' werden Listenverstehen genannt, sie sind sehr wichtige Werkzeuge in Python, aber in der Praxis konstruieren sie einfach eine Liste in einer Schleife. Das Listenverständnis definiert implizit "k", wenn es über die Elemente von "x" läuft, so dass von dort keine Fehler kommen. Sie können den Filterschritt separat durchführen, wenn Sie möchten. Bitte sehen Sie mein Update für weitere Erklärungen, lassen Sie mich wissen, wenn es noch unklar ist. –

+0

Das ist schön! Ich habe etwas in den vielen vielen Einträgen dieser Daten gefunden, die ein Problem verursachen ... Ich habe einige "N/A" -Einträge, bei denen die Trennungsangabe die Dezimalzahlen verwendet. Dies ist "Int" ersticken. Ich habe es versucht: 'filtered_rows = [k für k in x falls 'N/A' nicht in k [0] oder 'Slave' in k [1]]', aber dies bricht 'firstcol_filt = [int (str. split (k [0]) [0]) für k in filtered_rows] 'mit einem 'list index out of range' Fehler. – testname123