Liest eine tabulatorgetrennte Datei mit der ersten Spalte als Schlüssel und dem Rest als Werte

8

Ich habe eine Registerkarte getrennte Datei mit 1 Milliarde Zeilen von diesen (Imagine 200 Spalten statt 3):

%Vor%

Ich möchte ein Wörterbuch erstellen, in dem die Zeichenfolge in der ersten Spalte der Schlüssel und der Rest die Werte sind. Ich habe es so gemacht, aber es ist rechenintensiv:

%Vor%

Wie kann ich sonst das gewünschte Wörterbuch bekommen? Eigentlich wäre ein numpliges Array geeigneter als eine Liste von Floats für den Wert.

    
alvas 28.04.2015, 13:07
quelle

5 Antworten

4

Sie können pandas verwenden, um das df zu laden, dann ein neues df wie gewünscht erstellen und dann to_dict :

aufrufen %Vor%

BEARBEITEN

Eine dynamischere Methode und eine, die die Notwendigkeit, ein temporäres df zu konstruieren, reduzieren würde:

%Vor%

Weitere Aktualisierungen

Eigentlich brauchen Sie den ersten Lesevorgang nicht, die Spaltenlänge kann trotzdem implizit durch die Anzahl der Spalten in der ersten Spalte abgeleitet werden:

%Vor%     
EdChum 28.04.2015, 13:24
quelle
2

Sie können csv Modul zum Lesen der Datei verwenden, um die Aufteilung der Zeilen zu erhalten, dann verwenden Sie np.array , um die Float-Werte in ein numpiges Array-Objekt zu konvertieren:

%Vor%     
Kasramvd 28.04.2015 13:13
quelle
2

Sie können die numpy.genfromtxt() verwenden Funktion, wenn Sie die Anzahl der Spalten angeben:

%Vor%

Ausgabe:

%Vor%

Hinweis: Um programmatisch die Anzahl von cols zu finden, die Sie tun könnten:

%Vor%

Und dann num_cols für den Parameter usecols verwenden.

    
logic 28.04.2015 13:54
quelle
0

Eine Möglichkeit, Pandas zu verwenden. Angenommen, Sie tun df = pd.read_csv(file) und df ist wie

%Vor%

Ich habe Dummy-Spaltennamen hinzugefügt. Sie können dies beim Lesen der CSV-Datei ändern

Dann könnten Sie folgendes tun:

%Vor%     
Zero 28.04.2015 13:23
quelle
0

Tut mir leid, das ist nicht wirklich eine Antwort, aber zu lang für einen Kommentar.

Sie sagen, Sie haben 1 Milliarde Zeilen mit 200 Spalten Float. Es bedeutet eine minimale Erinnerung an

  

10 9 * 200 * 8 = 1,6 10 12 Bytes

Es gibt mehr als 1.5 G, ohne den Overhead für das Diktat zu zählen.

Natürlich können Sie numpy -Arrays anstelle von Float-Listen verwenden, aber jedes Array ist klein (200 Elemente), also bezweifle ich stark, dass die Verstärkung wichtig ist.

IMHO, für so viele Daten sollten Sie die Ladephase nicht berücksichtigen, unabhängig davon, wie Sie die Daten verarbeiten und wenn Sie wirklich ein Wörterbuch von einer Milliarde Datensätze mit jeweils 200 Gleitkommawerten benötigen Die aktuelle Implementierung ist korrekt, genauso wie ein numpliges Array.

Sie könnten einen wichtigen Vorteil in der weiteren Verarbeitung bekommen, wenn Sie alle Daten in einem einzigen numply Array haben könnten, und numpy für den Verarbeitungsteil verwendet haben, aber ohne mehr davon zu wissen, ist es nur Spekulation.

    
Serge Ballesta 28.04.2015 14:24
quelle

Tags und Links