2016-01-15 2 views
1

J'ai ce qui semble être un OrderdDict contenant OrderedDict dans un sous-ensemble de ce que je veux dire, c'est OrderedDict 'principal'. J'essaye d'analyser cet objet à un DataFrame de Pandas. (J'utilise Python 3, distribution Anaconda.)Python: Analyse syntaxique de OrderedDict dans des données Pandas

J'ai recherché et trouvé quelques exemples de compréhension de telles structures de données, mais les structures dans les exemples ne semblent pas correspondre aux miennes.

Comme vous pouvez le voir dans l'exemple ci-dessous, les OrderedDicts qui m'intéressent sont imbriqués dans une clé appelée 'records' dans le OrderedDict 'principal'. Je voudrais prendre l'exemple ci-dessous:

od = OrderedDict([('totalSize', 3), ('done', True), ('records', [OrderedDict([('attributes', OrderedDict([('type', 'Cust'), ('url', '/example/url/foo/bar/123')])), ('Id', '4563456kjgfu4uyHHY3'), ('Phone', None), ('FirstName', 'Bill'), ('LastName', 'Bob'), ('Email', '[email protected]')]), OrderedDict([('attributes', OrderedDict([('type', 'Cust'), ('url', '/example/url/foo/bar/234')])), ('Id', 'KJ23jdkd889DKJD'), ('Phone', '(444) 444-4444'), ('FirstName', 'Amanda'), ('LastName', 'Smith'), ('Email', '[email protected]')]), OrderedDict([('attributes', OrderedDict([('type', 'Cust'), ('url', '/example/url/foo/bar/654')])), ('Id', '23kkjKJkj2323KJ33'), ('Phone', '(555) 555-5555'), ('FirstName', 'Julie'), ('LastName', 'jackson'), ('Email', '[email protected]')])])])

... et obtenir une trame de données avec les colonnes Id ', 'Téléphone', 'FirstName', 'LastName', et 'Email'.

Jusqu'à présent, je suis en mesure d'extraire ce que je crois être une liste de listes:

li = [] 
list1 = [(record['Id'], record['Phone'],record['FirstName'],record['LastName']) 
for record in od['records']] 
li.append(list1) 
li[:] 

Cette liste de stratégie de listes, ne mentionne pas cependant la possibilité de noms de colonnes. Je voudrais s'il vous plaît demander votre aide pour obtenir cette dernière étape de la façon dans un DataFrame Pandas.

Merci beaucoup d'avance.

Répondre

0

Je ne suis pas familier avec Pandas DataFrame, mais la construction d'un dictionnaire de listes semblait être une bonne chose à faire.

# Attributes of interest 
attrs = ['Id', 'Phone', 'FirstName', 'LastName', 'Email'] 
records = od['records'] 

data = {} 

for rec in records: 
    for k in attrs: 
     # setdefault initializes the array for key if necessary 
     data.setdefault(k, []).append(rec[k]) 

dframe = pandas.DataFrame(data) 

print(dframe) 

Une solution qui ne nécessite pas de spécifier les champs. attributes est ignoré car il n'a pas été spécifié comment le gérer, bien qu'il puisse probablement être manipulé comme les autres.

records = od['records'] 
data = {} 

for rec in records: 
    for k, v in rec.items(): 
     if k == 'attributes': 
      continue 
     data.setdefault(k, []).append(v) 

dframe = pandas.DataFrame(data) 
print(dframe) 
+0

Merci! J'ai essayé de voter, mais je n'ai pas encore la réputation de le faire. Je marquerais comme résolu mais la solution exige de déclarer manuellement une liste d'ID de colonne. Il serait idéal de pouvoir extraire dynamiquement les Ids des colonnes sans avoir à les spécifier. Je sais que je n'ai pas spécifié cela comme une exigence, donc si personne d'autre ne suggère une solution pour cela, je vais marquer comme résolu. Merci encore. – gpanda

+0

@gpanda J'ai ajouté une version qui ne nécessite pas de spécifier les noms des colonnes –

+0

Brillant, c'est d'une grande aide, merci. Pour tous ceux qui tentent d'analyser les données retournées par simple-salesforce, ce sera une excellente solution. – gpanda