web-dev-qa-db-fra.com

Déplacement d'une colonne de structure de données et modification de l'ordre des colonnes

J'ai un dataframe appelé df qui a les en-têtes de données suivants:

date           A    B     C   D    E    F      G          H       I
07/03/2016  2.08    1   NaN NaN 1029    2   2.65    4861688 -0.0388
08/03/2016  2.20    1   NaN NaN 1089    2   2.20    5770819 -0.0447
:                                                                 :   

09/03/2016  2.14    1   NaN NaN 1059    2   2.01    5547959 -0.0514
10/03/2016  2.25    1   NaN NaN 1089    2   1.95    4064482 -0.0520

Existe-t-il un moyen de modifier l'ordre des colonnes de sorte que la colonne F soit déplacée vers une position après la colonne H. La df résultante ressemblerait à ceci:

date           A    B     C   D    E    F      G          H  F       I
07/03/2016  2.08    1   NaN NaN 1029    2   2.65    4861688  2 -0.0388
08/03/2016  2.20    1   NaN NaN 1089    2   2.20    5770819  2 -0.0447
:                                                                    :   

09/03/2016  2.14    1   NaN NaN 1059    2   2.01    5547959  2 -0.0514
10/03/2016  2.25    1   NaN NaN 1089    2   1.95    4064482  2 -0.0520
5
Stacey

Utilisez ceci : 

df = df[['date','A','B','C','D','E','F','G','H','F','I']]

--- Modifier 

columnsName = list(df.columns)
F, H = columnsName.index('F'), columnsName.index('H')
columnsName[F], columnsName[H] = columnsName[H],columnsName[F]
df = df[columnsName]
3
asapo kL

Utilisez df.insert avec df.columns.get_loc pour déterminer dynamiquement la position d'insertion.

col = df['F'] # df.pop('F') # if you want it removed
df.insert(df.columns.get_loc('H') + 1, col.name, col, allow_duplicates=True)

df
         date     A  B   C   D     E  F     G        H  F       I
0  07/03/2016  2.08  1 NaN NaN  1029  2  2.65  4861688  2 -0.0388
1  08/03/2016  2.20  1 NaN NaN  1089  2  2.20  5770819  2 -0.0447
...
3
coldspeed

Il s’agit d’un moyen via pd.DataFrame.iloc , qui utilise l’indexation par emplacement entier pour la sélection par position.

Cela rappelle également que l'indexation d'entiers pandas est basée sur numpy.

import pandas as pd
import numpy as np

df = pd.DataFrame(columns=list('ABCDEFGHI'))

cols = np.insert(np.arange(df.shape[1]),
                 df.columns.get_loc('H')+1,
                 df.columns.get_loc('F'))

res = df.iloc[:, cols]

print(res)

Empty DataFrame
Columns: [A, B, C, D, E, F, G, H, F, I]
Index: []
1
jpp

Pas pour l'auteur de cette question, mais peut-être pour d'autres.

list = df.columns.tolist() # list the columns in the df
list.insert(8, list.pop(list.index('F'))) # Assign new position (i.e. 8) for "F" 
df = df.reindex(columns= list) # Now move 'F' to ist new position
0
k.koen

Vous pouvez utiliser:

df.reindex(['A', 'B', 'C', 'D', 'E', 'F', 'G', 'H', 'F', 'I'], axis=1)
0
llllllllll