J'ai les éléments suivants DataFrame
( df
):
import numpy as np
import pandas as pd
df = pd.DataFrame(np.random.rand(10, 5))
J'ajoute plus de colonnes par affectation:
df['mean'] = df.mean(1)
Comment puis-je déplacer la colonne mean
vers l'avant, c'est-à-dire la définir comme première colonne sans modifier l'ordre des autres colonnes?
MultiIndex
.Réponses:
Un moyen simple serait de réaffecter la trame de données avec une liste des colonnes, réorganisées au besoin.
Voici ce que vous avez maintenant:
Réorganisez
cols
comme vous le souhaitez. Voici comment j'ai déplacé le dernier élément vers la première position:Réorganisez ensuite la trame de données comme ceci:
la source
cols
estlist
; il autorise même les doublons (qui seront supprimés lorsqu'ils seront utilisés sur la trame de données). Vous pensez auxIndex
objets.Vous pouvez également faire quelque chose comme ceci:
Vous pouvez obtenir la liste des colonnes avec:
La sortie produira:
... qui est ensuite facile à réorganiser manuellement avant de le déposer dans la première fonction
la source
df.columns.tolist()
df = df[['mean1', 0, 1, 2, 3]]
✓pd.read_csv()
. Comment votre réponse peut-elle être utilisée pour modifier l'ordre des colonnes?Attribuez simplement les noms de colonne dans l'ordre que vous souhaitez:
Maintenant, la colonne «moyenne» apparaît à l'avant:
la source
<df>.columns
que vous prétendez au départQue diriez-vous:
http://pandas.pydata.org/pandas-docs/stable/dsintro.html#column-selection-addition-deletion
la source
pandas
? quelque chose comme çadf.move(0,df.mean)
?df_metadata.insert(0,'Db_name',"raw_data")
(Code non pertinent pour ce sujet)*** ValueError: cannot insert mean, already exists
Dans ton cas,
fera exactement ce que vous voulez.
Dans mon cas (forme générale):
la source
copy=False
mais il semble quereindex_axis
crée toujours une copie.Vous devez créer une nouvelle liste de vos colonnes dans l'ordre souhaité, puis utiliser
df = df[cols]
pour réorganiser les colonnes dans ce nouvel ordre.Vous pouvez également utiliser une approche plus générale. Dans cet exemple, la dernière colonne (indiquée par -1) est insérée comme première colonne.
Vous pouvez également utiliser cette approche pour réorganiser les colonnes dans un ordre souhaité si elles sont présentes dans le DataFrame.
la source
Vous pouvez essayer les solutions suivantes:
Solution 1:
Solution 2:
Solution 3:
Solution 4:
Solution 5:
solution 6:
Comparaison de temps:
Solution 1:
Solution 2 :
Solution 3 :
Solution 4 :
Solution 5 :
Solution 6 :
la source
df = df.iloc[:, [1, 2, 3, 0]]
A partir d'août 2018:
Si les noms de vos colonnes sont trop longs pour être saisis, vous pouvez spécifier le nouvel ordre via une liste d'entiers avec les positions:
Les données:
Exemple générique:
Et pour le cas spécifique de la question d'OP:
Le principal problème avec cette approche est que le fait d'appeler plusieurs fois le même code créera des résultats différents à chaque fois, il faut donc être prudent :)
la source
Cette fonction vous évite d'avoir à lister toutes les variables de votre jeu de données juste pour en commander quelques-unes.
Il prend deux arguments, le premier est l'ensemble de données, le second sont les colonnes de l'ensemble de données que vous souhaitez mettre en avant.
Donc, dans mon cas, j'ai un ensemble de données appelé Frame avec les variables A1, A2, B1, B2, Total et Date. Si je veux amener Total au premier plan, il me suffit de:
Si je veux mettre Total et Date au premier plan, je fais:
ÉDITER:
Une autre façon utile de l'utiliser est que, si vous avez une table inconnue et que vous recherchez des variables avec un terme particulier, comme VAR1, VAR2, ... vous pouvez exécuter quelque chose comme:
la source
Je suis tombé sur une question similaire moi-même et je voulais juste ajouter ce sur quoi je me suis installé. J'ai aimé le
reindex_axis() method
pour changer l'ordre des colonnes. Cela a fonctionné:Une autre méthode basée sur le commentaire de @Jorge:
Bien que
reindex_axis
semble être légèrement plus rapide dans les micro-benchmarks quereindex
, je pense que je préfère ce dernier pour sa franchise.la source
Faites simplement,
la source
order = df.columns.tolist()
df['mean'] = df.mean(1)
df.columns = ['mean'] + order
headers
, qui a été utilisée pour créer un dict qui a ensuite été utilisé pour créer le DataFrame, j'ai appelédf.reindex(columns=headers)
. Le seul problème que j'ai rencontré était que j'avais déjà appelédf.set_index('some header name', inplace=True)
, donc lorsque la réindexation a été effectuée, il a ajouté une autre colonne nomméesome header name
car la colonne d'origine était maintenant l'index. Quant à la syntaxe spécifiée ci-dessus,['mean'] + df.columns
dans l'interpréteur python me donneIndex(u'meanAddress', u'meanCity', u'meanFirst Name'...
Vous pouvez faire ce qui suit (en empruntant des parties de la réponse d'Aman):
la source
Saisissez simplement le nom de la colonne que vous souhaitez modifier et définissez l'index du nouvel emplacement.
Pour votre cas, cela ressemblerait à:
la source
Déplacement d'une colonne vers n'importe quelle position:
la source
Je pense que c'est une solution légèrement plus soignée:
Cette solution est quelque peu similaire à la solution de @JoeHeffer mais il s'agit d'un liner.
Ici, nous
"mean"
supprimons la colonne du cadre de données et l'attachons à l'index0
avec le même nom de colonne.la source
Voici un moyen de déplacer une colonne existante qui modifiera le bloc de données existant en place.
la source
Cette question a été répondu avant mais reindex_axis est maintenant dépréciée donc je suggère d'utiliser:
la source
Que diriez-vous d'utiliser "T"?
la source
@clocker: Votre solution m'a été très utile, car je voulais mettre deux colonnes en avant à partir d'une trame de données où je ne connais pas exactement les noms de toutes les colonnes, car elles sont générées à partir d'une instruction pivot auparavant. Donc, si vous êtes dans la même situation: Pour mettre en avant des colonnes dont vous connaissez le nom, puis les laisser suivre par "toutes les autres colonnes", j'ai trouvé la solution générale suivante;
la source
set()
:Une approche simple utilise
set()
, en particulier lorsque vous avez une longue liste de colonnes et que vous ne souhaitez pas les gérer manuellement:la source
J'ai aimé la réponse de Shoresh pour utiliser la fonctionnalité d'ensemble pour supprimer les colonnes lorsque vous ne connaissez pas l'emplacement, mais cela n'a pas fonctionné pour moi car j'ai besoin de conserver l'ordre des colonnes d'origine (qui a des étiquettes de colonnes arbitraires).
J'ai réussi à faire fonctionner cela en utilisant IndexedSet à partir du package boltons.
J'ai également dû rajouter plusieurs étiquettes de colonne, donc pour un cas plus général, j'ai utilisé le code suivant:
J'espère que cela sera utile à toute personne recherchant ce fil pour une solution générale.
la source
set
à cette fin assez souvent et je n'ai jamais eu à faire de commande.Vous pouvez utiliser
reindex
ce qui peut être utilisé pour les deux axes:la source
Voici une fonction pour le faire pour n'importe quel nombre de colonnes.
la source
Méthode la plus hackeuse du livre
la source
Je pense que cette fonction est plus simple. Il vous suffit de spécifier un sous-ensemble de colonnes au début ou à la fin ou les deux:
la source
Je pense que la réponse de @ Aman est la meilleure si vous connaissez l'emplacement de l'autre colonne.
Si vous ne connaissez pas l'emplacement de
mean
, mais que vous ne connaissez que son nom, vous ne pouvez pas y recourir directementcols = cols[-1:] + cols[:-1]
. Voici la prochaine meilleure chose que j'ai pu trouver:la source
Le simple retournement aide souvent.
Ou mélangez simplement pour un look.
la source
La plupart des réponses n'ont pas généralisé suffisamment et la méthode pandas reindex_axis est un peu fastidieuse, donc j'offre une fonction simple pour déplacer un nombre arbitraire de colonnes vers n'importe quelle position en utilisant un dictionnaire où clé = nom de colonne et valeur = position vers laquelle se déplacer. Si votre trame de données est grande, passez True à 'big_data' alors la fonction renverra la liste des colonnes ordonnées. Et vous pouvez utiliser cette liste pour découper vos données.
la source
J'ai un cas d'utilisation très spécifique pour réorganiser les noms de colonnes dans les pandas. Parfois, je crée une nouvelle colonne dans une trame de données basée sur une colonne existante. Par défaut, les pandas insèrent ma nouvelle colonne à la fin, mais je veux que la nouvelle colonne soit insérée à côté de la colonne existante dont elle est dérivée.
la source
Une solution assez simple qui a fonctionné pour moi est d'utiliser .reindex sur df.columns:
la source