J'ai un dictionnaire python qui ressemble à ceci:

d = {'comp_1': {'property_4': 24, 'property_2': 45, 'property_3': 124, 'missing': 39, 'property_1': 16}, 
 'comp_2': {'property_4': 23, 'property_2': 49, 'property_3': 126, 'property_1': 16, 'missing': 38}, 
 'comp_3': {'property_4': 24, 'property_2': 43, 'property_1': 19, 'missing': 30, 'property_3': 116}}

Lorsque je le charge dans une trame de données panda et essaie de l'imprimer, il se présente comme suit:

df = pd.DataFrame.from_dict(hits, orient='index')
print(df)

Production:

        missing  property_1  property_2  property_3  property_4
comp_1       39          16          45         124          24
comp_2       38          16          49         126          23
comp_3       30          19          43         116          24

Maintenant, je veux renommer les colonnes, alors j'essaie:

df = pd.DataFrame.from_dict(hits, orient='index' columns=reversed(['Missing', 'P1', 'P2', 'P3', 'P4']))

Ce qui donne un bloc de données vide (ce que je suppose parce que ces clés n'existent pas dans le dictionnaire?):

Empty DataFrame
Columns: []
Index: []

Si j'essaye à la place:

df = pd.DataFrame.from_dict(hits, orient='index')
columns = reversed(['Missing', 'P1', 'P2', 'P3', 'P4'])
df.columns=columns

Les colonnes sont renommées par ordre n'est pas conservé, donc à chaque fois que je lance le code, le nombre ne correspond pas à la colonne, par exemple:

        P4  P3   P2  P1  Missing
comp_1  16  24  124  45       39
comp_2  16  23  126  49       38
comp_3  19  24  116  43       30

Et:

        P4  P3  P2   P1  Missing
comp_1  24  16  39  124       45
comp_2  23  16  38  126       49
comp_3  24  19  30  116       43

Je suppose que je dois en quelque sorte fournir des clés du dictionnaire imbriqué lorsque je charge des données dans la trame de données, mais je ne sais pas comment le faire. Ou est-ce autre chose que je dois faire?

Modifier: J'ai également essayé de renommer les colonnes avec le dictionnaire comme suit:

df.rename({'missing': 'Missing', 'property_1': 'P1', 'property_2': 'P2', 'property_3': 'P3',
           'property_4': 'P4'})

Mais les anciens noms sont toujours affichés

2
G.M 13 mars 2019 à 22:57

2 réponses

Meilleure réponse

Malheureusement, le paramètre columns dans to_dict spécifie uniquement les colonnes que vous souhaitez sélectionner. Par exemple,

pd.DataFrame.from_dict(hits, orient='index', columns=['property_4'])

        property_4
comp_1          24
comp_2          23
comp_3          24

Sélectionne uniquement la colonne "property_4", ignorant tout le reste. Bien sûr, cela a du sens, car les dictionnaires n'ont pas de commande en soi. Votre seule option consiste à renommer les clés ou renommer les colonnes à l'aide de DataFrame.rename().

cmap = {'property_1': 'P1', 'property_2': 'P2', 'property_3': 'P3', 
        'property_4': 'P4', 'missing': 'Missing'}
df = df.rename(columns=cmap)
df

        P4  P2   P3  Missing  P1
comp_1  24  45  124       39  16
comp_2  23  49  126       38  16
comp_3  24  43  116       30  19
4
cs95 13 mars 2019 à 20:02

Vous pouvez fournir un dict pour remplacer les colonnes et vous donner un mappage 1: 1. L'ajout de l'indicateur sur place le fera dans la trame de données existante, en omettant cela vous donnera une nouvelle trame de données avec les nouveaux noms de colonne.

df.rename(columns = {
    'property_1': 'P1',
    'property_2': 'P2',
    'property_3': 'P3',
    'property_4': 'P4',
    'missing': 'Missing'
    }, inplace = True)
1
Subsum44 13 mars 2019 à 20:08