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.)
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.]]
Vous pouvez utiliser ceci:
columnsTitles = ['onething', 'secondthing', 'otherthing']
frame = frame.reindex(columns=columnsTitles)
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.
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
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
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
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']
)
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
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']]