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.)

Durbachit
la source

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.]]
A.Kot
la source
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)
Okroshiashvili
la source
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
Lala La
la source
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.

omri_saadon
la source
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
piRSquared
la source
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
MaxU
la source
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']
)
irene
la source
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
U10-avant
la source
-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']]
Sando K
la source