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


105

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

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, j'aimerais 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.)

Réponses:


159

Sélectionnez simplement l'ordre vous-même en saisissant les noms des colonnes. Notez les doubles crochets:

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

26
Cela ne fonctionne qu'avec cet exemple plutôt petit. 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 ceux-ci semblent être beaucoup plus courants. Le PO a demandé une solution générale.
chrisfs

84

Vous pouvez utiliser ceci:

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

frame = frame.reindex(columns=columnsTitles)

6
Même si la plupart des autres solutions sont plus concises, je considère que celle-ci est la plus lisible pour quiconque n'est pas familier à 100% pandas.
Dirk

3
N'oubliez pas d'attribuer la valeur de retour à une variable, cela ne modifie pas l'ordre des colonnes sur place (du moins pas dans la pandasv0.23`).
Dirk

Merci @Dirk pour la suggestion
Okroshiashvili

34

Voici une solution que j'utilise très souvent. Lorsque vous avez un grand ensemble de données avec des tonnes de colonnes, vous ne voulez certainement pas réorganiser manuellement toutes les colonnes.

Ce que vous pouvez et, très probablement, voulez faire, c'est simplement classer les premières colonnes que vous utilisez fréquemment et laisser toutes les autres colonnes être elles-mêmes. Il s'agit d'une approche courante dans R.df %>%select(one, two, three, everything())

Vous pouvez donc d'abord taper manuellement les colonnes que vous souhaitez ordonner et positionner avant toutes les autres colonnes d'une liste cols_to_order.

Ensuite, vous construisez une liste pour les nouvelles colonnes en combinant le reste des colonnes:

new_columns = cols_to_order + (frame.columns.drop(cols_to_order).tolist())

Après cela, vous pouvez utiliser les new_columnsautres solutions suggérées.

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

cols_to_order = ['one thing', 'second thing']
new_columns = cols_to_order + (frame.columns.drop(cols_to_order).tolist())
frame = frame[new_columns]

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

1
brillant, parfait. merci de m'avoir empêché de taper chaque nom de colonne ou index
stuart

Ceci est la réponse générale et devrait être la réponse acceptée
CarlosH

26

Vous pouvez également 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

En outre, vous pouvez 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 alors facile à réorganiser manuellement.


13

Construisez-le 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

Je n'ai pas pu obtenir le 'nom de la colonne': les données fonctionnent dans une liste comme dans un dict.
Kim Miller

10

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

6

Ajoutez le paramètre 'colonnes':

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

4

Essayez l'indexation (vous voulez donc une solution générique non seulement pour cela, donc l'ordre des index peut être exactement ce que vous voulez):

l=[0,2,1] # index order
frame=frame[[frame.columns[i] for i in l]]

Maintenant:

print(frame)

Est:

   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

-2

Je trouve que c'est le plus simple et le plus fonctionnel:

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

df = df[['one thing','second thing', 'other thing']]
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.