1
votes

Créer une trame de données Pandas à partir d'un dict imbriqué

J'ai un dict imbriqué avec la structure suivante: course_id, dict imbriqué avec: 2 cours recommandés et le nombre d'achats pour chaque cours. Par exemple, les entrées de ce dict ressemblent à ceci:

result=pd.DataFrame.from_dict(dicts, orient='index').stack().reset_index()
result.columns=['Course ID','Recommended course','Number of purchases']

J'ai essayé ce code pour créer un dataframe à partir de ce dict:

 {490: {566: 253, 551: 247},
 357: {571: 112, 356: 100},
 507: {570: 172, 752: 150}}

Cela ne fonctionne pas tout à fait pour moi, car je veux un sortie où il y aura 5 colonnes. ID du cours, cours recommandé 1, achats 1, cours recommandé 2, achats 2. Existe-t-il une solution à ça? Merci d'avance.


2 commentaires

Veuillez montrer à quoi ressemble la sortie attendue avec une trame de données synthétique.


Oui, et veuillez expliquer ce que contient le dictionnaire imbriqué.


3 Réponses :


1
votes

Je vous recommande de simplement remodeler votre dictionnaire, puis de recréer votre dataframe, mais vous n'êtes pas loin d'obtenir votre sortie cible à partir de votre dataframe actuel.

nous pouvons groupby et utilisez cumcount pour créer notre colonne unique puis désempiler et attribuer notre colonne à partir de l'en-tête multi-index qui a été créé.

s1 = result.groupby(['Course ID',
             result.groupby(['Course ID']).cumcount() + 1]).first().unstack()

s1.columns = [f"{x}_{y}" for x,y in s1.columns]


              Recommended course_1  Recommended course_2  Number of purchases_1  \
Course ID                                                                      
357                         571                   356                  112.0   
490                         566                   551                  253.0   
507                         570                   752                  172.0   

           Number of purchases_2  
Course ID                         
357                        100.0  
490                        247.0  
507                        150.0


0 commentaires

0
votes

Pas efficace, mais devrait fonctionner dans votre cas: -

   Course ID  Recommended course 1  purchases 1  Recommended Course 2  \
0        490                   566          253                   551
1        357                   571          112                   356
2        507                   570          172                   752

   purchases 2
0          247
1          100
2          150

Résultat: -

df = pd.DataFrame([(k,list(v.keys())[0],list(v.values())[0],list(v.keys())[1],list(v.values())[1]) for k,v in a.items()], columns = ['Course ID','Recommended course 1','purchases 1', 'Recommended Course 2', 'purchases 2'])
print(df)


0 commentaires

0
votes

Vous pouvez utiliser la chaîne itertools pour convertir le dict imbriqué en une liste plate de paires de clés et de valeurs et le stocker dans un dictionnaire d2 en utilisant la compréhension du dictionnaire où les clés sont l'identifiant du cours, puis continuez avec la formation du dataframe à l'aide de pandas.

    id   rec_course1  n_purch_1  rec_course2  n_purch_2
0  490           566        253          551        247
1  357           571        112          356        100
2  507           570        172          752        150

df

import pandas as pd
from itertools import chain

d = {
    490: {566: 253, 551: 247},
    357: {571: 112, 356: 100},
    507: {570: 172, 752: 150}
}

d2 = {k: list(chain.from_iterable(v.items())) for k, v in d.items()}
df = pd.DataFrame.from_dict(d2, orient='index').reset_index()
df.columns = ['id','rec_course1', 'n_purch_1', 'rec_course2', 'n_purch_2']


0 commentaires