2017-01-26 2 views
1

Ich habe eine ziemlich seltsam strukturierte CSV-Datei. Die Spaltenfelder bestehen aus Zahlen, und die Zeilen sind teilweise, aber nicht perfekt nach dem ersten Spaltenfeld gruppiert. Zum Beispiel, wenn die Spaltendaten {Zahl1, Zahl2, number3}, würde die Datei wie folgt aussehen:(Python) Wie gruppiert man Zeilen nach erster Spalte, nicht nach Reihenfolge sortieren?

, 12, 4932
, 32, 4643
, 95 , 3921
...
143, 98, 2432
143, 28, 3910
...
, 43, 2910
, 54, 2190
...
572, 91, 8492
572, 92, 9302
572, 15, 3902 ...

321, 93, 7281
321, 48, 6218 ...

, 78, 0148
, 91, 7281

Das Problem ist, dass ich die Datei benötigen perfekt von der ersten Spalte, so dass das obige Beispiel gruppiert werden soll:

321, 12, 4932
321, 32, 4643
321, 95, 3921
321, 93, 7281
321, 48, 6218
...
143, 98, 2432
143, 28, 3910
...
832, 43, 2910
832, 54, 2190
832, 78, 0148
832, 91, 7281
...
572, 91, 8492
572, 92 9302,
572, 15, 3902
...

.. und auch zugleich, wie es oben gezeigt ist, sollte die erste Spalte nicht in Reihenfolge sortiert werden. Ich brauche die Reihenfolge der ersten Spalte, um gleich zu sein (was komisch klingen könnte, aber da es teilweise gruppiert ist, hat es eine bestimmte Reihenfolge in einem großen Maßstab).

Was könnte der schnellste Algorithmus sein, um dieses Problem zu lösen?

Antwort

2

Ordnen sie die Zeilen in Listen, die in einem dict von der ersten Spalte verkeilt gespeichert sind. Verwenden Sie ein OrderedDict, wenn Sie die Reihenfolge beibehalten möchten, in der Sie sie aus der ursprünglichen Tabelle gelesen haben. So etwas wie dieser (ungetestet Code)

from collections import OrderedDict 
... 
d = OrderedDict() 

# open the csv file as reader 

for row in reader: 
    key = row[0] 
    d.setdefault(key,[]).append(row) 

und das Ergebnis

for key,rowlist in d.items() 
    for row in rowlist: 
     # do whatever with row 
+0

habe ich OrderedDict und es hat seinen Zweck erfüllt gut genug. Vielen Dank. – user3052069

1

Sie eine Liste und ein Wörterbuch verwenden können, während Sie die Datei Parsen, die Wörterbuch Gruppe von der ersten Zeile und der Liste der Zeilen mit den ersten Reihen bestellen zu erhalten:

grouped_rows = {} 
rows = [] 
with open("your_file") as ins: 
    for line line in ins: 
     first = line.split(",")[0] 
     if first in rows: 
      grouped_rows[first].append(line) 
      continue 
     rows.append(first) 
     grouped rows[first] = [line] 

Dann können Sie drucken sie einfach durch die Liste Parsen und die Daten aus dem Wörterbuch-Abfrage:

for row in rows: 
    print "\n".join(grouped_rows[row]) 
2

Sie können verwenden versuchen, es als solche hartzucodieren aber für CSV-Dateien in Python würde ich mit Pandas empfehlen. Pandas ist ein import für Python speziell für CSV-Dateien erstellt. Sie können ziemlich einfach sortieren, gruppieren, Datensätze erstellen. Sie können die CSV-Datei auch lesen und benutzerdefinierte Spalten und Zeilen erstellen. wie zum Beispiel:

import pandas as pd 
df = pd.DataFrame({'A' : [321,143,832]}) 

werde ich einige Dokumentation Links verlassen, in dem Sie festlegen, welche Funktion am besten Ihre Bedürfnisse implementieren in Python finden. Basic Tutorial . Scroll to GroupingTutorial with Examples

einfachste und schnellste Weg wäre Pandas zu verwenden für Ihre CSV

Verwandte Themen