136 votes

Définir l'ordre des colonnes dans un dataframe pandas

Existe-t-il un moyen de réorganiser les colonnes d'un cadre de données pandas en fonction de mes préférences personnelles (c'est-à-dire sans tri alphabétique ou numérique, mais plutôt en suivant certaines conventions) ?

Un exemple simple :

frame = pd.DataFrame({
        'one thing':[1,2,3,4],
        'second thing':[0.1,0.2,1,2],
        'other thing':['a','e','i','o']})

produit ceci :

   one thing other thing  second thing
0          1           a           0.1
1          2           e           0.2
2          3           i           1.0
3          4           o           2.0

Mais à la place, je voudrais ceci :

   one thing second thing  other thing
0          1           0.1           a
1          2           0.2           e
2          3           1.0           i
3          4           2.0           o

(Veuillez fournir une solution générique plutôt que spécifique à ce cas. Merci beaucoup).

196voto

A.Kot Points 3343

Il suffit de sélectionner l'ordre vous-même en tapant les noms des colonnes. Notez les doubles parenthèses :

frame = frame[['column I want first', 'column I want second'...etc.]]

45 votes

Cela ne fonctionne que dans le cadre de ce petit exemple. Si vous lisez des données à partir d'une autre source, comme un fichier csv ou une table de base de données, vous ne pouvez pas utiliser cette réponse. Et ces cas semblent être beaucoup plus fréquents. Le PO a demandé une solution générale.

0 votes

Il s'agit évidemment d'une solution générale. Même si vous lisez les noms de colonnes et les ordres à partir d'un fichier csv différent, vous pouvez extraire les noms de colonnes de la liste et utiliser la notation ci-dessus facilement. Quel est l'intérêt non général de cette réponse ?

0 votes

Pour effectuer des opérations sur la liste des noms de colonnes au lieu de les taper, rappelez-vous que vous pouvez y accéder comme suit list(frame.columns) ou similaire.

122voto

Vous pouvez utiliser ceci :

columnsTitles = ['onething', 'secondthing', 'otherthing']

frame = frame.reindex(columns=columnsTitles)

9 votes

Même si la plupart des autres solutions sont plus concises, je considère que celle-ci est la plus lisible pour toute personne qui n'est pas familière à 100% avec les éléments suivants pandas .

4 votes

N'oubliez pas d'assigner la valeur de retour à une variable, car cela ne modifie pas l'ordre des colonnes sur place (du moins pas dans le système de gestion des données). pandas v0.23`).

0 votes

Cela fonctionne pour moi, merci ?

29voto

omri_saadon Points 49

Vous pourriez aussi faire quelque chose comme df = df[['x', 'y', 'a', 'b']]

import pandas as pd
frame = pd.DataFrame({'one thing':[1,2,3,4],'second thing':[0.1,0.2,1,2],'other thing':['a','e','i','o']})
frame = frame[['second thing', 'other thing', 'one thing']]
print frame
   second thing other thing  one thing
0           0.1           a          1
1           0.2           e          2
2           1.0           i          3
3           2.0           o          4

Vous pouvez également obtenir la liste des colonnes avec :

cols = list(df.columns.values)

La sortie produira quelque chose comme ceci :

['x', 'y', 'a', 'b']

Ce qui est ensuite facile à réorganiser manuellement.

13voto

piRSquared Points 159

Construire avec une liste au lieu d'un dictionnaire

frame = pd.DataFrame([
        [1, .1, 'a'],
        [2, .2, 'e'],
        [3,  1, 'i'],
        [4,  4, 'o']
    ], columns=['one thing', 'second thing', 'other thing'])

frame

   one thing  second thing other thing
0          1           0.1           a
1          2           0.2           e
2          3           1.0           i
3          4           4.0           o

0 votes

Je n'ai pas réussi à faire fonctionner 'column name' : data dans une liste comme dans un dict.

10voto

MaxU Points 5284

Vous pouvez également utiliser OrderedDict :

In [183]: from collections import OrderedDict

In [184]: data = OrderedDict()

In [185]: data['one thing'] = [1,2,3,4]

In [186]: data['second thing'] = [0.1,0.2,1,2]

In [187]: data['other thing'] = ['a','e','i','o']

In [188]: frame = pd.DataFrame(data)

In [189]: frame
Out[189]:
   one thing  second thing other thing
0          1           0.1           a
1          2           0.2           e
2          3           1.0           i
3          4           2.0           o

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