2016-07-16 13 views
0

Ich arbeite mit csvfiles. Mein Ziel ist es, ein JSON-Format mit csvfile Informationen zu schreiben. Eigen, ich willSchreiben Sie Json-Format mit Pandas-Serie und DataFrame

Beispiel ein ähnliches Format wie miserables.json erhalten:

{"source": "Napoleon", "target": "Myriel", "value": 1}, 

Nach den Informationen, die ich das Format haben wäre:

[ 
{ 
    "source": "Germany", 
    "target": "Mexico", 
    "value": 1 
}, 
{ 
    "source": "Germany", 
    "target": "USA", 
    "value": 2 
}, 
{ 
    "source": "Brazil", 
    "target": "Argentina", 
    "value": 3 
} 
] 

jedoch mit dem Code I die Ausgabe verwendet sieht wie folgt:

[ 
{ 
    "source": "Germany", 
    "target": "Mexico", 
    "value": 1 
}, 
{ 
    "source": null, 
    "target": "USA", 
    "value": 2 
} 
][ 
{ 
    "source": "Brazil", 
    "target": "Argentina", 
    "value": 3 
} 
] 

Null Quelle muss sei Deutschland. Dies ist eines der Hauptprobleme, denn es gibt mehr Städte mit diesem Problem. Außerdem sind die Informationen korrekt. Ich möchte nur einige Listen innerhalb des Formats entfernen und null in das richtige Land ersetzen.

Dies ist der Code, den ich mit pandas und collections verwendet habe.

csvdata = pandas.read_csv('file.csv', low_memory=False, encoding='latin-1') 
countries = csvdata['country'].tolist() 
newcountries = list(set(countries)) 
for element in newcountries: 
    bills = csvdata['target'][csvdata['country'] == element] 
    frquency = Counter(bills) 
    sourceTemp = [] 
    value = [] 
    country = element 
    for k,v in frquency.items(): 
     sourceTemp.append(k) 
     value.append(int(v)) 
    forceData = {'source': Series(country), 'target': Series(sourceTemp), 'value': Series(value)} 
    dfForce = DataFrame(forceData) 
    jsondata = dfForce.to_json(orient='records', force_ascii=False, default_handler=callable) 
    parsed = json.loads(jsondata) 
    newData = json.dumps(parsed, indent=4, ensure_ascii=False, sort_keys=True) 
    # since to_json doesn´t have append mode this will be written in txt file 
    savetxt = open('data.txt', 'a') 
    savetxt.write(newData) 
    savetxt.close() 

Alle Vorschläge zur Lösung dieses Problems sind zu schätzen!

Dank

+3

Können Sie einige Zeilen der CSV-Eingabedatei angeben? –

Antwort

1

Betrachten Sie die Series() um den skalaren Wert Entfernen Land. Indem Sie so vorgehen und dann die Wörterbücher der Serie in einen Datenrahmen upgraden, zwingen Sie NaN (später umgewandelt in null in json) in die Reihe, um die Längen anderer Reihen zusammenzubringen. Sie können sehen, durch den dfForce Datenrahmen Ausdrucke:

from pandas import Series 
from pandas import DataFrame 

country = 'Germany'  
sourceTemp = ['Mexico', 'USA', 'Argentina'] 
value = [1, 2, 3] 

forceData = {'source': Series(country), 
      'target': Series(sourceTemp), 
      'value': Series(value)} 
dfForce = DataFrame(forceData) 

#  source  target value 
# 0 Germany  Mexico  1 
# 1  NaN  USA  2 
# 2  NaN Argentina  3 

zu beheben, einfach Land als skalare im Wörterbuch der Serie halten:

forceData = {'source': country, 
      'target': Series(sourceTemp), 
      'value': Series(value)} 
dfForce = DataFrame(forceData) 

#  source  target value 
# 0 Germany  Mexico  1 
# 1 Germany  USA  2 
# 2 Germany Argentina  3 

By the way, brauchen Sie nicht ein Dataframe-Objekt zur Ausgabe an json. Verwenden Sie einfach eine Liste von Wörterbüchern. Berücksichtigen Sie Folgendes mit einem Ordered Dictionary collection (um die Reihenfolge der Schlüssel zu erhalten). Auf diese Weise wird die wachsende Liste in eine Textdatei ohne angehängt, die ein ungültiges JSON rendern würde, da die gegenüberliegenden eckigen Klammern ...][... nicht erlaubt sind.

from collections import OrderedDict 
... 

data = [] 

for element in newcountries: 
    bills = csvdata['target'][csvdata['country'] == element] 
    frquency = Counter(bills) 

    for k,v in frquency.items(): 
     inner = OrderedDict() 
     inner['source'] = element 
     inner['target'] = k 
     inner['value'] = int(v) 

     data.append(inner) 

newData = json.dumps(data, indent=4) 

with open('data.json', 'w') as savetxt: 
    savetxt.write(newData) 
+0

Danke, @Parfait Viel besser. – estebanpdl

Verwandte Themen