web-dev-qa-db-fra.com

Définir l'ordre des colonnes dans pandas dataframe

Est-il possible de réorganiser les colonnes dans pandas dataframe en fonction de mes préférences personnelles (c'est-à-dire non triées par ordre alphabétique ou numérique, mais plutôt comme suit 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 au lieu de cela, 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.)

81
durbachit

Il suffit de sélectionner vous-même la commande en tapant les noms des colonnes. Notez les doubles crochets:

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

Vous pouvez utiliser ceci:

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

frame = frame.reindex(columns=columnsTitles)
52

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

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.

21
omri_saadon

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 que vous voulez probablement faire est de simplement ordonner les premières colonnes que vous utilisez fréquemment et de laisser toutes les autres colonnes être elles-mêmes. C'est une approche courante dans R. df %>%select(one, two, three, everything())

Ainsi, vous pouvez d’abord saisir 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 le new_columns comme autres 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[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
11
Lala La

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
11
piRSquared

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
9
MaxU

Ajoutez le paramètre 'columns':

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']
)
6
irene

Essayez d’indexer (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
3
U10-Forward

Je trouve cela très simple et efficace:

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']]
0
Sando K