2017-08-29 1 views
2

Ich habe eine CSV mit einer Reihe von Daten. Eine der Spalten ExtraParams enthält ein JSON-Objekt. Ich möchte einen Wert mit einem bestimmten Schlüssel extrahieren, aber es dauert eine Weile, bis ich die 60.000 Zeilen in der CSV-Datei gelesen habe. Kann es beschleunigt werden?Wert aus JSON-Spalte extrahieren sehr langsam

counter = 0 #just to see where I'm at 

order_data['NewColumn'] = '' 

for row in range(len(total_data)):   
s = total_data['ExtraParams'][row]  
try:  
    data = json.loads(s) 
    new_data = data['NewColumn'] 

    counter += 1 
    print(counter) 

    order_data['NewColumn'][row] = new_data 
except: 
    print('NewColumn not in row') 

Ich benutze eine try-except, weil einige der Reihen haben, was ich davon ausgehen, ist JSON vermasselt, wie sie das Programm mit einem „erwarten Trennzeichen‚‘“ abstürzen Fehler.

Wenn ich sage "langsam" meine ich ~ 30 Minuten für 60.000rows.

EDIT: Es könnte nichts wert sein jeder JSON enthält etwa 35 Schlüssel/Wert-Paare.

+0

können Sie ein Beispiel für Ihre JSON teilen? – MedAli

+1

Weder JSON noch CSV werden für große Dateien erstellt. Sie sollten überlegen, die Daten in eine Datenbank zu importieren und von dort zu verarbeiten. Es könnte eine gute Idee sein, einen DB-Server mit JSON-Unterstützung zu verwenden. –

+0

@KlausD. Das ist wahrscheinlich die beste Idee, ja. Ich konnte niemanden finden, der effizient das tut, was ich ausschließlich mit Python/Pandas für einen großen Datensatz machen möchte. [This] (https://stackoverflow.com/questions/14262433/large-data-work-flows-using-pandas) Post könnte jedoch eine Lösung bieten. – Khaine775

Antwort

3

Sie könnten etwas wie pandas verwenden und die apply Methode verwenden. Für einige einfache Beispieldaten in test.csv

Col1,Col2,ExtraParams 
1,"a",{"dog":10} 
2,"b",{"dog":5} 
3,"c",{"dog":6} 

Sie so etwas wie

In [1]: import pandas as pd 

In [2]: import json 

In [3]: df = pd.read_csv("test.csv") 

In [4]: df.ExtraParams.apply(json.loads) 
Out[4]: 
0 {'dog': 10} 
1 {'dog': 5} 
2 {'dog': 6} 
Name: ExtraParams, dtype: object 

Wenn Sie extrahieren ein Feld aus der json, vorausgesetzt, das Feld verwenden könnte, ist in jeder Zeile vorhanden Sie schreiben können eine Lambda-Funktion wie

In [5]: df.ExtraParams.apply(lambda x: json.loads(x)['dog']) 
Out[5]: 
0 10 
1  5 
2  6 
Name: ExtraParams, dtype: int64 
+0

Aber das lädt den gesamten JSON in eine Spalte oder? Ich bin grundsätzlich nur an einem bestimmten Wert von JSON interessiert. – Khaine775

+0

reagierte inline mit einem Beispiel – mgilbert