1
votes

Pandas DataFrame - dictionnaire en lignes en colonnes

La source de DataFrame est une liste de dictionnaires comme -
ls = [{'fileName': 'file_01', 'col1': {'key1': 'value1a', 'key2': 'value1b'}}, {'fileName': 'file_02', 'col1' : {'key1': 'value2a', 'key2': 'value2b', 'key3': 'value2c'}}, {'fileName': 'file_03', 'col1': {'key1': 'value3a', 'key3': 'value3c'}}]

DataFrame créé en tant que
df = pd.DataFrame (ls, columns = ['fileName', 'col1'])

Pandas DataFrame df ressemble à - p >

fileName     key1_value1a     key1_value2a     key1_value3a
file_01      value1a           
file_02                       value2a   
file_03                                        value3a            

Comment puis-je convertir ceci pour qu'il ressemble à -

fileName     key1      key2      key3
file_01      value1a   value1b 
file_02      value2a   value2b   value2c
file_03      value3a             value3c

J'ai essayé -
df = pd.concat ([df ['fileName'], pd.get_dummies (df ['col1' ']. apply (pd.Series))], axis = 1)

Je vois des résultats dans certains cas comme -

fileName     col1 
file_01      {'key1':value1a, 'key2':value1b}
file_02      {'key1':value2a, 'key2':value2b, 'key3':value2c}
file_03      {'key1':value3a, 'key3':value3c}


2 commentaires

Veuillez fournir des exemples de données dans un format facile à utiliser pour les utilisateurs. Comment ce DataFrame est-il créé? Il y a des chances qu'il y ait un moyen de créer les colonnes directement, sans stocker d'abord les dictionnaires.


@AMC Question modifiée en fonction de votre entrée. La réponse acceptée permet d'obtenir les résultats souhaités à partir de l'étape initiale. Voyez-vous une meilleure approche pour éviter le problème au moment de la création de DataFrame lui-même?


3 Réponses :


2
votes

Pouvez-vous essayer ce qui suit:

df1 = pd.concat([df[['fileName']], pd.DataFrame(df['col1'].to_list())], axis=1)

Ce qui précède fonctionnera si {'key1': value1a, 'key2': value1b}, {'key1': value2a, ' key2 ': value2b,' key3 ': value2c}, ... sont de type dict

Cette solution fonctionnera également, mais les solution fournie par @Vorsprung a l'air bien.


3 commentaires

oui ils sont de type dict . J'ai essayé df1 = pd.concat ([df [['fileName']], pd.DataFrame (df ['col1']. Values)) , mais j'obtiens SyntaxError: syntaxe invalide


Il manquait un ] . df1 = pd.concat ([df [['fileName']], pd.DataFrame (df ['col1']. values)]) donne un nouveau DataFrame avec les colonnes fileName et 0 . 0 n'a aucune valeur.


Merci! Cette solution fonctionne également. Up a voté la même chose. Cependant, j'ai utilisé la solution fournie dans la réponse acceptée plus tôt.



4
votes

Utilisez pd.json_normalize () :

In [40]: pd.concat([df['fileName'], pd.json_normalize(df['col1'])],axis=1)      
Out[40]: 
   fileName     key1     key2     key3
0   file_01  value1a  value1b      NaN
1   file_02  value2a  value2b  value2c
2   file_03  value3a      NaN  value3c


0 commentaires

1
votes

Vous pouvez essayer la solution suivante:

df1 = pd.concat([df['fileName'], df['col1'].apply(pd.Series)], axis=1)

df ['col1']. apply (pd.Series) diviser dict en colonnes séparées. p >


2 commentaires

Merci! Cette solution fonctionne également. Up a voté la même chose. Cependant, j'ai utilisé la solution fournie dans la réponse acceptée plus tôt.


Dans votre cas, si vous vous souciez des performances, il est préférable d'utiliser la méthode pd.json_normalize () . L'utilisation de la méthode apply () est cependant flexible.