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?
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.
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)
Vous pouvez juste faire:
df [triés (df.colonnes)]
Edit: plus court est
df[sorted(df)]
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
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)
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.
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
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)
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) ], []) ]
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']