2017-01-27 1 views
0

Ich arbeite an einem Code, um einige Datenanalyse durchzuführen. Ich möchte die Zahlen in den Datenspalten vergleichen.Vergleicht Spalten von Daten in CSV-Datei und finde/bearbeiten schlechte Datenpunkte

Die Einschränkung, die ich verwenden möchte, ist, wenn die Spalte mit "POA"> 900 ist, dann müssen die Spalten A401 A402 UND A403> 7 sein. Wenn diese Bedingung nicht erfüllt ist, möchte ich etwas mit den Daten tun so kann es leicht gefunden werden. Außerdem möchten Sie die VT-Spalte nicht in die Testbedingung aufnehmen.

Würde mich wirklich etwas Hilfe schätzen, wenn mir jemand in die richtige Richtung zeigen kann.

Probe von Daten Ich Eingabe als .csv

DateTime  A0401 A0402 A0403 VT  POA 
11/1/2014 0:00 1.12 0.96 1.11 4.06 50.00 
11/1/2014 0:01 1.12 0.95 1.11 4.06 50.00 
11/1/2014 0:02 1.12 0.95 1.11 4.06 100.00 
11/1/2014 0:03 1.12 0.95 1.11 4.06 300.00 
11/1/2014 0:04 1.12 0.96 1.11 4.06 901.00 
11/1/2014 0:05 1.12 0.95 1.11 4.06 40.00 
11/1/2014 0:06 1.12 0.95 1.11 4.06 0.00 
11/1/2014 0:07 1.12 0.96 1.11 4.06 904.00 
11/1/2014 0:09 1.12 0.96 1.11 4.06 100.00 
11/1/2014 0:10 1.12 0.96 1.11 3.93 150.00 
+0

Tipp: Verwenden Sie das Modul ['csv'] (https://docs.python.org/3/library/csv.html#module-csv), um die Datei zu lesen (und zu aktualisieren). – martineau

+0

Und was hast du bisher versucht? –

Antwort

1

Angenommen, Sie haben eine Datei data.csv mit dem Inhalt haben:

DateTime  A0401 A0402 A0403 VT  POA 
11/1/2014 0:00 1.12 0.96 1.11 4.06 50.00 
11/1/2014 0:01 1.12 0.95 1.11 4.06 50.00 
11/1/2014 0:02 1.12 0.95 1.11 4.06 100.00 
11/1/2014 0:03 1.12 0.95 1.11 4.06 300.00 
11/1/2014 0:04 1.12 0.96 1.11 4.06 901.00 
11/1/2014 0:05 1.12 0.95 1.11 4.06 40.00 
11/1/2014 0:06 1.12 0.95 1.11 4.06 0.00 
11/1/2014 0:07 1.12 0.96 1.11 4.06 904.00 
11/1/2014 0:09 1.12 0.96 1.11 4.06 100.00 
11/1/2014 0:10 1.12 0.96 1.11 3.93 150.00 

Dann können Sie es mit Python wie folgt verarbeiten:

# Open the file 
with open('data.csv', 'r') as f: 
    # Split each line into row "cells" 
    rows = [row.split('\t') for row in f] 
    # Keep only non-empty strings (not "falsy") and remove extra spaces (strip) 
    rows = [[cell.strip() for cell in row if cell] for row in rows] 

def isValidRow(row): 
    return float(row[5]) <= 900 or all(float(val) > 7 for val in row[1:4]) 

header, rows = rows[0], rows[1:] 
validRows = list(map(isValidRow, rows)) 

# Write output 
with open('output.csv', 'w') as f: 
    f.write('\t'.join(header + ['IsValid']) + '\n') 
    for row, valid in zip(rows, validRows): 
     f.write('\t'.join(row + [str(valid)]) + '\n') 

Dann output.txt würde enthalten:

DateTime A0401 A0402 A0403 VT POA IsValid 
11/1/2014 0:00 1.12 0.96 1.11 4.06 50.00 True 
11/1/2014 0:01 1.12 0.95 1.11 4.06 50.00 True 
11/1/2014 0:02 1.12 0.95 1.11 4.06 100.00 True 
11/1/2014 0:03 1.12 0.95 1.11 4.06 300.00 True 
11/1/2014 0:04 1.12 0.96 1.11 4.06 901.00 False 
11/1/2014 0:05 1.12 0.95 1.11 4.06 40.00 True 
11/1/2014 0:06 1.12 0.95 1.11 4.06 0.00 True 
11/1/2014 0:07 1.12 0.96 1.11 4.06 904.00 False 
11/1/2014 0:09 1.12 0.96 1.11 4.06 100.00 True 
11/1/2014 0:10 1.12 0.96 1.11 3.93 150.00 True 
+0

Danke. Kannst du mir erklären, was diese Linie macht? rows = [[Zelle.strip() für Zelle in Zeile.split ('') if Zelle] für Zeile in dat.split ('\ n')] Kopfzeile, Zeilen = Zeilen [0], Zeilen [1:] – acb

+0

@acb Sicher, ich habe es so bearbeitet, es ist mehr Schritt für Schritt mit Kommentaren – jdehesa

+0

eine letzte Frage für Sie, wenn es Ihnen nichts ausmacht. Wenn ich die Daten aus einer CSV-Datei importieren möchte anstatt Daten = "" "...." "" zu setzen, wie würde ich das machen? Ich versuche, es mit Pandas zu importieren, aber beim Versuch, die Zeilen zu teilen, erhalte ich einen Fehler. – acb

0

Verwenden https://docs.python.org/2/library/csv.html Ihre CSV-Daten in ein iterable Objekt zu lesen.

Ich vermute, dass Sie meinen, wenn POA> 900 und A0401, A0402 und A0403> 7 sind, sonst möchten Sie etwas anderes mit den Daten tun?

for row in reader: 
    if not (row[5] > 900 and row[1] > 7 and row[2] > 7 and row[3] > 7): 
     #do something 

Die andere Bedeutung Ihrer Frage könnte das sein, wenn POA> 900 ist dann A0401, A0402 und A0403 auf mehr als 7, sonst, was Sie tun wollen, etwas anderes setzen Sie wollen.

In diesem Fall

for row in reader: 
    if row[5] > 900: 
     row[1] = 7.1 
     row[2] = 7.1 
     row[3] = 7.1 
    else: 
     #do something 

Für die etwas tun, ich bin nicht ganz sicher, was Sie mit Ihnen die Daten wollen leicht zu finden, aber ich nehme an, dass Sie es irgendwie hervorheben möchten . Wenn Sie möchten, dass es leicht gefunden wird, können Sie Ihren CSV-Daten eine weitere Spalte hinzufügen. Etwas wie "markiert", das standardmäßig auf 0 gesetzt wird.

Wenn Sie eine Ausnahme finden, setzen Sie sie einfach auf 1, dann können Sie die Daten durchsehen und alle Zeilen finden, deren Flags auf 1 gesetzt sind, um Ihre Ausnahmen zu finden.

+0

Ja, ich entschuldige mich, wenn das nicht klar war. Grundsätzlich habe ich versucht zu sagen, dass, wenn POA> 900 und A0401, A0402 und A0403 <7 sind, der Datenpunkt schlecht ist. Das Markieren dieser fehlerhaften Datenpunkte ist das, was ich tun möchte. – acb

Verwandte Themen