web-dev-qa-db-fra.com

déplacer la colonne dans le cadre de données de pandas

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.

13
user308827

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]]
37
Alexander
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
25
Charlie Haley

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
1
jpp

Vous pouvez également le faire en une ligne:

df.drop(columns=['b', 'x']).assign(b=df['b'], x=df['x'])
0
hdinh