2 votes

Comment convertir un dictionnaire de colonnes en un dictionnaire de lignes ?

Si c'est un doublon, faites-le moi savoir - mais j'ai essayé de trouver une réponse sur Stack mais je n'ai pas pu.

Bonjour, je ne suis pas sûr si cela nécessite une fonction récursive - j'ai réfléchi mais je ne suis pas sûr de la meilleure façon de convertir ce dictionnaire.

Essentiellement, j'ai obtenu des données CSV et les ai converties en le dictionnaire de colonnes suivant:

{
    'column1': [DonnéesLigne1Col1, DonnéesLigne2Col1],
    'column2': [DonnéesLigne1Col2, DonnéesLigne2Col2],
    'column3': [DonnéesLigne1Col3, DonnéesLigne2Col3]
}

et je veux le convertir en ceci:

{
    'ligne1':{
            'column1': DonnéesLigne1Col1,
            'column2': DonnéesLigne1Col2
           },
    'ligne2':{
            'column1': DonnéesLigne2Col1,
            'column2': DonnéesLigne2Col2
           }
}

Essentiellement, échanger les éléments du dictionnaire des colonnes aux lignes. Quelqu'un peut-il aider, ou fournir un lien vers une solution car j'ai eu du mal à en trouver une.

Quand je parle de 'ligne1' et 'ligne2' dans mon deuxième exemple, ils peuvent simplement être un nombre croissant (par exemple 1, 2, 3) ils n'ont pas besoin d'être spécifiques - ils représentent simplement chaque ligne.

Voici ce que j'ai déjà essayé (avec data étant ce à quoi ressemble le premier extrait de code):

nouvelles_données = {}

for colonne in data:
    count = 1
    for point_de_donnée in colonne:
        if clé not in nouvelles_données:
            nouvelles_données[str(compte)] = {}

        nouvelles_données[str(compte)][colonne] = point_de_donnée
        compte += 1

Mais cela ne fonctionne pas correctement, on dirait qu'il itère sur chaque lettre des noms de clés de données. Quelqu'un peut-il m'aider à trouver une solution?

4voto

Yohann Lereclus Points 178

Utilisation de la bibliothèque pandas et de dataframe.transpose() :

import pandas as pd

your_dict = {
    "column1": ["Row1Col1Data", "Row2Col1Data"],
    "column2": ["Row1Col2Data", "Row2Col2Data"],
    "column3": ["Row1Col3Data", "Row2Col3Data"],
}

output_dict = pd.DataFrame(your_dict).transpose().to_dict()

Résultat :

{
    0: {
        "column1": "Row1Col1Data",
        "column2": "Row1Col2Data",
        "column3": "Row1Col3Data",
    },
    1: {
        "column1": "Row2Col1Data",
        "column2": "Row2Col2Data",
        "column3": "Row2Col3Data",
    },
}

Il y a probablement une meilleure façon de le faire je suppose.

4voto

Scott Hunter Points 10356

Si vous n'avez pas pandas disponible :

{ ('row%d' % (1+i)) : {j : coldata[j][i] for j in coldata.keys()} for i in range(len(coldata['column1'])) }

2voto

Fakher Mokadem Points 749

Si le nombre de lignes est cohérent dans tout le fichier csv (vos données sont une matrice), alors vous pouvez le faire sans aucune bibliothèque tierce :

data = {
    "colonne1": ["DonnéeLigne1Col1", "DonnéeLigne2Col1"],
    "colonne2": ["DonnéeLigne1Col2", "DonnéeLigne2Col2"],
    "colonne3": ["DonnéeLigne1Col3", "DonnéeLigne2Col3"],
}

nombre_lignes = len(data["colonne1"]) 
nombre_colonnes = len(data.keys())
nouvelles_donnes = {"ligne" + str(i + 1): {"colonne" + str(j + 1) : list(data.values())[j][i] for j in range(nombre_colonnes)} for i in range(nombre_lignes)}} 

Voici le résultat :

>>> nouvelles_donnes
{
'ligne1': {'colonne1': 'DonnéeLigne1Col1',
          'colonne2': 'DonnéeLigne1Col2',
          'colonne3': 'DonnéeLigne1Col3'},
 'ligne2': {'colonne1': 'DonnéeLigne2Col1',
          'colonne2': 'DonnéeLigne2Col2',
          'colonne3': 'DonnéeLigne2Col3'}
}

1voto

dizzy77 Points 543

Avec Python vanille :

col_data = {
    'col1': ['r1c1', 'r2c1'],
    'col2': ['r1c2', 'r2c2'],
    'col3': ['r1c3', 'r2c3'],
}

# Vérification de sécurité au cas où les colonnes n'ont pas la même longueur
col_len = min(len(col) for col in col_data.values())

row_data = {f'row{i+1}': [val[i] for val in col_data.values()]
             for i in range(col_len)}

Valeur résultante de row_data :

{
    'row1': ['r1c1', 'r1c2', 'r1c3'],
    'row2': ['r2c1', 'r2c2', 'r2c3']
}

0voto

jetprop Points 76

Cela vous donne exactement ce que vous avez demandé en une seule ligne en utilisant la compréhension de liste.

def transpose(input_dict):

output_dict = {
    f"row{j+1}": {
        f"column{i+1}": values[1][j] for i, values in enumerate(input_dict.items())
    }
    for j in range(len(next(iter(input_dict.values()))))
}

return output_dict

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X