2
votes

La création de Pandas DataFrame à partir d'une liste ou d'un dict renvoie toujours un DF vide

J'essaye de créer un dataframe pandas à partir d'un dictionnaire. Les clés du dictionnaire sont des chaînes et les valeurs sont une ou plusieurs listes. J'ai un problème étrange dans lequel la commande pd.DataFrame () renvoie systématiquement un dataframe vide même lorsque je lui passe un objet non vide comme une liste ou un dict. Mon code est similaire au suivant:

pd.DataFrame(dict, columns)

Je souhaite donc créer un DF qui ressemble à ceci:

    A  B  C 
ID1 1  2  3
ID2 10 11 12
ID2 2  34 11
ID3 8  3  12

Quand je vérifie le contenu de df, j'obtiens "Empty DataFrame" et si j'itère sur son contenu, j'obtiens juste les noms de colonnes et aucune des données dans myDictionary! J'ai vérifié la documentation et cela devrait être une commande directe:

myDictionary = {"ID1":[1,2,3], "ID2":[10,11,12],[2,34,11],"ID3":[8,3,12]}
df = pd.DataFrame(myDictionary, columns = ["A","B","C"])

Cela ne me donne pas le résultat que je recherche et je ne sais pas pourquoi. Quelqu'un a des idées? Merci!


5 commentaires

Qu'essayez-vous de faire avec ID2? Ce n'est pas une paire clé / valeur correcte pour un dictionnaire.


Salut, donc j'essaye de créer un dictionnaire avec où nous avons une ou plusieurs listes pour chaque ID. Je peux donc avoir plusieurs enregistrements pour le même identifiant et je souhaite les regrouper sous la même clé. Donc je suppose que les valeurs seraient alors une liste de listes! Par exemple {"ID2": [[list1], [list2]]} est-ce que cela a du sens?


Si tel est le cas, vous devez en faire une liste et vous assurer que vous ajoutez des valeurs nan à ID1 et ID2 pour vous assurer qu'elles ont toutes le même nombre de valeurs, sinon il ne sera pas compilé.


Bonjour, je viens de modifier ma question pour inclure le dataframe que je voudrais. Je vois ce que vous dites sur les NaN. cela donnerait à chaque clé le même nombre de valeurs. Un problème est que je ne saurai pas à l'avance si un identifiant aura 1 liste ou 2 ou 3, etc.


IIUC, "ID2": [10,11,12], [2,34,11] doit être "ID2": [[10,11,12], [2,34 , 11]] .


6 Réponses :


1
votes

essayez l'exemple ci-dessous pour comprendre pourquoi df est vide:

myDictionary = {"ID1":[1,2,3], "ID2":[10,11,12],"ID3":[8,3,12]}
df = pd.DataFrame(myDictionary).rename(columns={'ID1':'A', 'ID2':'B', 'ID3':'C'})

et ce que vous voulez est:

myDictionary = {"ID1":[1,2,3], "ID2":[10,11,12],"ID3":[8,3,12], 'A':[0, 0, 0]}
df = pd.DataFrame(myDictionary, columns = ["A","B","C"])


0 commentaires

0
votes

Vous transmettez les noms "ID1", "ID2" et "ID3" dans pd.DataFrame comme noms de colonne, puis vous dites aux pandas d'utiliser les colonnes A, B, C. Puisqu'il n'y a pas de colonnes A, B , C pandas renvoie un DataFrame vide. Utilisez le code ci-dessous pour créer le DataFrame:

"ID2":[10,11,12],[2,34,11]

Sortie:

   ID1  ID2  ID3
0    1   10    8
1    2   11    3
2    3   12   12

Et de plus ceci:

import pandas as pd

myDictionary = {"ID1": [1, 2, 3], "ID2": [10, 11, 12], "ID3": [8, 3, 12]}
df = pd.DataFrame(myDictionary, columns=["ID1", "ID2", "ID3"])
print(df)


0 commentaires

0
votes

Premièrement, la liste [2,34,11] n'a pas de nom de colonne. DONNE LUI UN NOM!

La raison de votre erreur est que lorsque vous utilisez la commande suivante:

df = pd.DataFrame(myDictionary, columns = ["ID1","ID2","ID3"])
df.rename(columns ={'ID1' : 'A', 'ID2': 'B', 'ID3': 'C'}, inplace = True)

Cela crée un dataframe basé sur votre dictionnaire. Mais alors vous dites que vous ne voulez que des colonnes de votre dictionnaire qui sont étiquetées «A», «B», «C», ce que votre dictionnaire n'a pas.

Essayez plutôt:

df = pd.DataFrame(myDictionary, columns = ["A","B","C"])


0 commentaires

2
votes

Ce que je recommanderais de faire dans cette situation, c'est d'interpréter votre liste de listes comme des chaînes. Plus tard, si vous avez besoin de modifier ou d'analyser l'un d'entre eux, vous pouvez utiliser un analyseur pour interpréter les colonnes.

Voir ci-dessous le code de travail qui vous permet de conserver votre liste de listes dans le dataframe.

myDictionary = {"ID1":'[1,2,3]', "ID2":'[10,11,12],[2,34,11]',"ID3":'[8,3,12]'}


df = pd.DataFrame(myDictionary, columns = ["ID1","ID2","ID3"], index = [0])
df.rename(columns ={'ID1' : 'A', 'ID2': 'B', 'ID3': 'C'}, inplace = True)
df.head(3)


0 commentaires

0
votes

vous ne pouvez pas créer un bloc de données où le niveau de deux lignes sera le même que le vôtre exemple

{"ID2":[10,11,12],"ID2":[2,34,11]}

et en même temps, c'est également vrai pour le dictionnaire aussi, dans le dictionnaire chaque clé doit être unique mais dans votre dataframe métionnée comme ci-dessous dictionnaire, ce qui est impossible

ID2 10 11 12
ID2 2  34 11

donc ma suggestion vous chagne la conception du dictionnaire et suivez tant de réponses sur le point de convertir le dictinaire en df


0 commentaires

0
votes

Voici une approche possible

Dictionnaire

df = pd.DataFrame(list(myDictionary.values()), index=myDictionary.keys(),
                                                columns=list('ABC'))
df.reset_index(inplace=True)
df = df.replace(r"_[0-9]", "", regex=True)
df.sort_values(by='index', inplace=True)

print(df)
  index   A   B   C
2   ID1   1   2   3
0   ID2  10  11  12
1   ID2   2  34  11
3   ID3   8   3  12

Obtenir un dictionnaire d qui contient des valeurs-clés pour les valeurs qui sont listes imbriquées dont (a) les clés sont uniques - utilisez un suffixe pour vous assurer que les clés de ce dictionnaire d sont uniques et (b) dont les valeurs sont des sous-listes aplaties de la liste imbriquée

  • pour ce faire, parcourez la boucle et
    • vérifier si la valeur contient une sous-liste
      • si tel est le cas, ajoutez cette paire clé: valeur à un dictionnaire distinct d
        • utilisez un suffixe pour séparer les clés identiques, car la clé ID2 ne peut pas être répétée dans un dictionnaire
          • chaque suffixe contiendra l'une des sous-listes de la liste imbriquée
        • générer une liste de clés à partir du dictionnaire d'origine (dans une variable nommée nested_keys myDictionary ), dont les valeurs sont des listes imbriquées
myDictionary = {**d, **myDictionary}

print(myDictionary)
{'ID2_1': [10, 11, 12], 'ID2_2': [2, 34, 11], 'ID1': [1, 2, 3], 'ID3': [8, 3, 12]}

(En utilisant la liste des clés dont les valeurs sont listes imbriquées - nested_keys ) Obtenez un second dictionnaire contenant des valeurs qui ne sont pas des listes imbriquées - voir ce message SO pour savoir comment procéder

myDictionary = {key: myDictionary[key] for key in myDictionary if key not in nested_keys}

print(myDictionary)
{'ID1': [1, 2, 3], 'ID3': [8, 3, 12]}

Combinez les 2 dictionnaires ci-dessus en un seul dictionnaire

d = {}
nested_keys = []
for k,v in myDictionary.items():
    if any(isinstance(i, list) for i in v):
        for m,s in enumerate(v):
            d[k+'_'+str(m+1)] = s
        nested_keys.append(k)

print(d)
{'ID2_1': [10, 11, 12], 'ID2_2': [2, 34, 11]}

Convertissez le dictionnaire combiné en un DataFrame et supprimez le suffixe qui a été ajouté précédemment

myDictionary = {"ID1":[1,2,3], "ID2":[[10,11,12],[2,34,11]],"ID3":[8,3,12]}


0 commentaires