2017-10-18 4 views
2

Vous avez déjà un problème intéressant où il y a un dictionnaire dans le format suivant:Liste des Tuples à DF (Les tuples de longueur inégale)

test = {'A': [(1,2),(3,4)], 
     'B': [(1,2),(5,6),(7,8)]} 

Pour chaque clé dans le dictionnaire, ils partagent certaines valeurs (toujours en premier), mais il y a un nombre différent de tuples dans chaque liste.

En fin de compte, mon objectif est de représenter les données dans ce format:

 1 3 5 7 
    A 2 4 - - 
    B 2 - 6 8 

est-il un moyen intelligent pour convertir ces éléments communs dans les valeurs du dictionnaire à une colonne d'une trame de données?

Ce que je pensais pour obtenir les listes à la même longueur est la suivante:

#get all the unique first elements of the dictionary 
unique=[] 
for i in test.values(): 
    for j in i: 
     unique.append(j[0]) 

unique = set(unique) 

values_of_A = test['A'] 

#I thought this would loop through each tuple in the list and check if its 
#first value is in the list of unique elements; otherwise, it will print 
#0. However, it comes up with a blank list... 
full_list = [0 for i, v in enumerate(values_of_A) if v[0] not in unique] 

Merci comme toujours!

+1

Pouvez-vous expliquer un peu plus sur la façon dont vous voulez que les données contenues dans 'test' à transformer? Il n'est pas immédiatement clair quelle devrait être la logique dans la production de la production. – ASGM

+0

Oui - essayait juste de balayer tous les tuples et de mettre les éléments uniques dans la première position sur tous les tuples comme les en-têtes de colonne, alors les clés du dictionnaire comme première colonne et les valeurs de la table seraient la valeur associée rencontre. Je ne sais pas si c'est utile, mais peut-être que l'image ci-dessus aide avec des mots. Sinon, faites le moi savoir. De toute façon, la solution de juanpa était parfaite! – user6142489

+0

Heureux d'entendre que la solution de @ juanpa.arrivillaga a fonctionné - mais notez que la sortie que vous avez spécifiée ne correspond pas. (Ce n'est pas une critique de la réponse, que j'ai upvoted). – ASGM

Répondre

7

Vous pouvez probablement munge et utiliser le from_dict constructeur alternatif:

>>> pd.DataFrame.from_dict({k:dict(v) for k,v in test.items()}, orient='index') 
    1 3 5 7 
A 2 4.0 NaN NaN 
B 2 NaN 6.0 8.0 
>>> 
+0

Incroyablement efficace et exactement ce que je voulais. Je vous remercie! – user6142489

+1

@ user6142489 votre accueil. Notez, dans le futur, vous pouvez construire un ensemble directement, quelque chose comme 'unique = set()' et ensuite dans votre for-loop 'unique.add (j [0])' –

+0

Fait! Merci encore! – user6142489