web-dev-qa-db-fra.com

Réorganisation des colonnes dans le cadre de données pandas en fonction du nom de la colonne

J'ai une dataframe avec plus de 200 colonnes. Le problème est comme ils ont été générés la commande est

['Q1.3','Q6.1','Q1.2','Q1.1',......]

Je dois réorganiser les colonnes comme suit:

['Q1.1','Q1.2','Q1.3',.....'Q6.1',......]

Y at-il un moyen pour moi de faire cela dans Python?

200
pythOnometrist
df = df.reindex(sorted(df.columns), axis=1)

Cela suppose que le tri des noms de colonnes donnera l'ordre que vous souhaitez. Si vos noms de colonne ne trient pas lexicographiquement (par exemple, si vous voulez que la colonne Q10.3 apparaisse après Q9.1), vous devrez trier différemment, mais cela n'a rien à voir avec les pandas.

240
BrenBarn

Vous pouvez aussi faire plus succinctement:

df.sort_index(axis=1)

Assurez-vous de réattribuer le résultat: 

df = df.sort_index(axis=1)

Ou faites-le sur place:

df.sort_index(axis=1, inplace=True)
252
Wes McKinney

Vous pouvez juste faire:

 df [triés (df.colonnes)] 

Edit: plus court est 

df[sorted(df)]
23
Ivelin

La réponse de Tweet peut être transmise à la réponse de BrenBarn ci-dessus avec 

data.reindex_axis(sorted(data.columns, key=lambda x: float(x[1:])), axis=1)

Donc, pour votre exemple, dites:

vals = randint(low=16, high=80, size=25).reshape(5,5)
cols = ['Q1.3', 'Q6.1', 'Q1.2', 'Q9.1', 'Q10.2']
data = DataFrame(vals, columns = cols)

Vous recevez: 

data

    Q1.3    Q6.1    Q1.2    Q9.1    Q10.2
0   73      29      63      51      72
1   61      29      32      68      57
2   36      49      76      18      37
3   63      61      51      30      31
4   36      66      71      24      77

Alors fais:

data.reindex_axis(sorted(data.columns, key=lambda x: float(x[1:])), axis=1)

résultant en:

data


     Q1.2    Q1.3    Q6.1    Q9.1    Q10.2
0    2       0       1       3       4
1    7       5       6       8       9
2    2       0       1       3       4
3    2       0       1       3       4
4    2       0       1       3       4
17
Jeremy Low

N'oubliez pas d'ajouter "inplace = True" à la réponse de Wes ou de définir le résultat sur un nouveau DataFrame.

df.sort_index(axis=1, inplace=True)
15
burkesquires

Si vous avez besoin d'une séquence arbitraire au lieu d'une séquence triée, vous pouvez faire:

sequence = ['Q1.1','Q1.2','Q1.3',.....'Q6.1',......]
your_dataframe = your_dataframe.reindex(columns=sequence)

J'ai testé cela dans 2.7.10 et cela a fonctionné pour moi.

12
M.Z

Pour plusieurs colonnes, vous pouvez placer les colonnes dans l’ordre que vous souhaitez:

#['A', 'B', 'C'] <-this is your columns order
df = df[['C', 'B', 'A']]

Cet exemple montre le tri et le découpage des colonnes:

d = {'col1':[1, 2, 3], 'col2':[4, 5, 6], 'col3':[7, 8, 9], 'col4':[17, 18, 19]}
df = pandas.DataFrame(d)

Vous recevez:

col1  col2  col3  col4
 1     4     7    17
 2     5     8    18
 3     6     9    19

Alors fais:

df = df[['col3', 'col2', 'col1']]

Résultant en:

col3  col2  col1
7     4     1
8     5     2
9     6     3     
9
Myeongsik Joo

La méthode la plus rapide est:

df.sort_index(axis=1)

Sachez que cela crée une nouvelle instance. Par conséquent, vous devez stocker le résultat dans une nouvelle variable:

sortedDf=df.sort_index(axis=1)
3
multigoodverse

Un cas d'utilisation est que vous avez nommé (certaines de) vos colonnes avec un préfixe et que vous voulez que les colonnes soient triées avec ces préfixes dans leur ensemble et dans un ordre particulier (non alphabétique). 

Par exemple, vous pouvez démarrer toutes vos entités avec Ft_, des étiquettes avec Lbl_, etc., et vous souhaitez que toutes les colonnes non préfixées, toutes les entités, puis l'étiquette. Vous pouvez le faire avec la fonction suivante (je noterai un problème d'efficacité éventuel en utilisant sum pour réduire le nombre de listes, mais ce n'est pas un problème sauf si vous avez BEAUCOUP de colonnes, ce que je n'ai pas): 

def sortedcols(df, groups = ['Ft_', 'Lbl_'] ):
    return df[ sum([list(filter(re.compile(r).search, list(df.columns).copy())) for r in (lambda l: ['^(?!(%s))' % '|'.join(l)] + ['^%s' % i  for i in l ] )(groups)   ], [])  ]
0
Roko Mijic

Les méthodes sort et sorted vous permettent de fournir une fonction personnalisée permettant d'extraire la clé utilisée pour la comparaison:

>>> ls = ['Q1.3', 'Q6.1', 'Q1.2']
>>> sorted(ls, key=lambda x: float(x[1:]))
['Q1.2', 'Q1.3', 'Q6.1']
0
tweet