2017-09-25 3 views
0

Ich arbeite an einer ziemlich einfachen Sache: Anfrage an eine Datenbank, diese gibt mir ein [riesiges] Wörterbuch zurück. Es ist in Ordnung, ich liebe Wörterbücher. Aber ich bin kein Profi mit dieser Sache in Python.Werte aus Dictionaries in Datenframe-Spalten extrahieren

Mein Problem ist, dass ich dieses Wörterbuch in einen DataFrame konvertieren möchte. Es ist in Ordnung, ich habe es gegooglet und es funktioniert. Aber in meinem Wörterbuch habe ich andere Wörterbücher (ja, ich weiß ...).

Ich möchte aus diesen Wörterbücher nehmen (was in meinen Datenrahmen) sind die Werte der „Wert“ Schlüssel

Hier ist ein Beispiel ist und was habe ich versucht. Danke im Voraus.

[[res ist meine große Wörterbuch, das Ergebnis aus der Abfrage]]

res:

{'head': {'vars': ['id', 'marque', 'modele']}, 
'results': {'bindings': [{'id': {'type': 'literal', 'value': '1362'}, 
    'marque': {'type': 'literal', 'value': 'PEUGEOT'}, 
    'modele': {'type': 'literal', 'value': '206'}},.... 

pd.DataFrame (res [ 'Ergebnisse'] [ 'Bindungen' ], Säulen = res [ 'Kopf'] [ 'vars']): enter image description here

Wie Sie sehen können, gibt es ein anderes Wörterbuch in meinen Datenrahmen ist! Was ich will ist, die Werte aus dem "Wert" Schlüssel, in einer effizienten Art und Weise zu nehmen (in der Tat, ich weiß, wie man das mit einer großen Aussage tut, aber bitte nicht in Python).

Ich versuchte die Dinge wie res['results']['bindings']['values'] oder res['results']['bindings'].values() (or .values) und andere Dinge auf dem Dataframe wie df.values()['value'] = df.values(), aber es funktioniert nicht.

Antwort

2

IIUC, können Sie einen applymap verwenden und den Wert extrahieren, der mit dem Schlüssel value aus jedem Wörterbuch verknüpft ist.

import operator 

df = pd.DataFrame(res['results']['bindings'], columns=res['head']['vars']) 
df = df.applymap(operator.itemgetter('value')) 

Dies funktioniert unter der Annahme, dass jeder Zellenwert ein Wörterbuch ist.


Es könnte möglich sein, einige Ihrer Wörterbücher enthalten keine value als Schlüssel. In diesem Fall ist eine leichte Modifikation erforderlich, mit dict.get:

df = df.applymap(lambda x: x.get('value', np.nan) \ 
         if isinstance(x, dict) else np.nan) 

Dies wird auch die möglichen Probleme behandeln, die entstehen, wenn x keine dict sind.

+0

Es funktioniert. Und es ist sehr effizient. Vielen Dank ! :) Clément Edit: Vielen Dank für Ihren Hinweis auf den zweiten Teil Ihrer Antwort, es ist nützlich und ja, es kann passieren. –

+0

@ClementB Schön, dass es geholfen hat. –

2

können Sie json_normalize verwenden, die perfekt NaN s hinzufügen:

d = {'head': {'vars': ['id', 'marque', 'modele']}, 
'results': {'bindings': [{'id': {'type': 'literal', 'value': '1362'}, 
    'marque': {'type': 'literal', 'value': 'PEUGEOT'}, 
    'modele': {'type': 'literal', 'value': '206'}},{'id': {'type': 'literal', 'value': '1362'}, 
    'marque': {'type': 'literal', 'value': 'PEUGEOT'}}]}} 

from pandas.io.json import json_normalize  
df = json_normalize(d['results']['bindings']).filter(like='value') 
df.columns = df.columns.str.replace('.value','') 
print (df) 
    id marque modele 
0 1362 PEUGEOT 206 
1 1362 PEUGEOT NaN 
+0

Mit Dank zurück. –