J'ai le dataframe suivant:
a b x y
0 1 2 3 -1
1 2 4 6 -2
2 3 6 9 -3
3 4 8 12 -4
Comment puis-je déplacer les colonnes b et x de telle sorte qu'elles soient les 2 dernières colonnes du cadre de données? Je voudrais spécifier b et x par nom, mais pas les autres colonnes.
Vous pouvez réorganiser les colonnes directement en spécifiant leur ordre:
df = df[['a', 'y', 'b', 'x']]
Dans le cas d'images plus grandes où les titres de colonne sont dynamiques, vous pouvez utiliser une liste de compréhension pour sélectionner chaque colonne ne figurant pas dans votre jeu de cibles, puis ajouter le jeu de cibles à la fin.
>>> df[[c for c in df if c not in ['b', 'x']]
+ ['b', 'x']]
a y b x
0 1 -1 2 3
1 2 -2 4 6
2 3 -3 6 9
3 4 -4 8 12
Pour le rendre plus sûr, vous pouvez vous assurer que vos colonnes cibles sont bien dans le cadre de données:
cols_at_end = ['b', 'x']
df = df[[c for c in df if c not in cols_at_end]
+ [c for c in cols_at_end if c in df]]
cols = list(df.columns.values) #Make a list of all of the columns in the df
cols.pop(cols.index('b')) #Remove b from list
cols.pop(cols.index('x')) #Remove x from list
df = df[cols+['b','x']] #Create new dataframe with columns in the order you want
Vous pouvez utiliser le chemin ci-dessous. C'est très simple, mais similaire à la bonne réponse donnée par Charlie Haley.
df1 = df.pop('b') # remove column b and store it in df1
df2 = df.pop('x') # remove column x and store it in df2
df['b']=df1 # add b series as a 'new' column.
df['x']=df2 # add b series as a 'new' column.
Maintenant vous avez votre dataframe avec les colonnes 'b' et 'x' à la fin. Vous pouvez voir cette vidéo d'OSPY: https://youtu.be/RlbO27N3Xg4
Vous pouvez utiliser pd.Index.difference
avec np.hstack
, puis reindex
ou utiliser l'indexation basée sur une étiquette. En général, il est conseillé d'éviter les interprétations de liste ou autres boucles explicites avec des objets NumPy/Pandas.
cols_to_move = ['b', 'x']
new_cols = np.hstack((df.columns.difference(cols_to_move), cols_to_move))
# OPTION 1: reindex
df = df.reindex(columns=new_cols)
# OPTION 2: direct label-based indexing
df = df[new_cols]
# OPTION 3: loc label-based indexing
df = df.loc[:, new_cols]
print(df)
# a y b x
# 0 1 -1 2 3
# 1 2 -2 4 6
# 2 3 -3 6 9
# 3 4 -4 8 12
Vous pouvez également le faire en une ligne:
df.drop(columns=['b', 'x']).assign(b=df['b'], x=df['x'])