Je veux trier certaines colonnes dans une grande trame de données Pandas. Ces colonnes sont au milieu de df et à la fin. Ils commencent par "R"

columns_list = df.columns.tolist()
columns_list
Out[17]: 
['Id', 'Name', 'Surname', 'Radius', 'Ship', 'Country', 'Spacecraft', 'Planet', 'ExtraterrestialSupplier', 'R5', 'R2', 'R1', 'R4', 'R3', 'S3', 'S2', 'S4', 'S1', 'S6', 'S5', 'R5S3', 'R5S2', 'R5S4','R1S4']

Je voudrais commander à nouveau comme ça:

['Id', 'Name', 'Surname', 'Radius', 'Ship', 'Country', 'Spacecraft', 'Planet', 'ExtraterrestialSupplier', 'R1', 'R2','R3', 'R4', 'R5', 'S3', 'S2', 'S4', 'S1', 'S6', 'S5', 'R1S4', 'R5S2', 'R5S3','R5S4']

Jusqu'à présent, je l'ai fait manuellement:

df= df['Id', 'Name', 'Surname', 'Radius', 'Ship', 'Country', 'Spacecraft', 'Planet', 'ExtraterrestialSupplier', 'R1', 'R2','R3', 'R4', 'R5', 'S3', 'S2', 'S4', 'S1', 'S6', 'S5', 'R1S4', 'R5S2', 'R5S3','R5S4']

Mais les nouvelles données d'entrée ont plus de colonnes R et dans chaque fichier, elles sont différentes.

J'apprécierais vos conseils.

3
Ellla 2 juin 2020 à 23:42

4 réponses

Meilleure réponse

C'est étonnamment difficile. Je ne trouve pas de doublure unique, et le plus simple que je puisse trouver est:

# find the R columns
mask = df.columns.str.match('^R\d*$')

# numpy array
columns = df.columns.values

# sort the R parts
columns[mask] = sorted(columns[mask])

# assign back
df = df.reindex(columns, axis=1)
1
Quang Hoang 2 juin 2020 à 20:53

Cela devrait fonctionner, en supposant que les noms de colonnes non "R" et "S" ne changent pas. Si tel est le cas, je pense que vous devrez faire une chose regex pour trouver les noms des colonnes que vous souhaitez trier.

Je trie les noms ici par longueur, puis par ordre alphabétique, ce qui, je pense, ressemble à ce que vous faites.

new_df_columns = ['Id', 'Name', 'Surname', 'Radius', 'Ship', 'Country', 'Spacecraft',
               'Planet', 'ExtraterrestialSupplier', 'R5', 'R2', 'R1', 'R4', 'R3',
               'S3', 'S2', 'S4', 'S1', 'S6', 'S5', 'R5S3', 'R5S2', 'R5S4','R1S4']
df = pd.DataFrame(columns=new_df_columns)

base_columns = ['Id', 'Name', 'Surname', 'Radius', 'Ship', 'Country', 'Spacecraft',
               'Planet', 'ExtraterrestialSupplier',]
extra_cols = [name for name in new_df_columns if name not in base_columns]
sorted_extra = sorted(extra_cols, key = lambda x: (len(x),x))

df = df[base_columns + sorted_extra]
0
Tom 2 juin 2020 à 21:03
import pandas as pd
import numpy as np

df = pd.DataFrame(np.random.rand(5, 6), columns=['x','a','c','y','b','z'])

cols = list('xacybz')

df = DataFrame(randn(10, len(cols)), columns=cols)

preordered = list('xyz')

new_order = preordered + list(df.columns - preordered)

df.reindex(columns=new_order)
0
Shamsul Masum 2 juin 2020 à 20:53

Vous pouvez quelque chose comme ceci:

columns_list = df.columns.tolist()

temp_R_list = [i[-1] for i in columns_list[8:13]]

temp_R_list.sort(key=int)

temp_R_list = ['R' + i for i in temp_R_list]

## Output:  ['R1', 'R2', 'R3', 'R4', 'R5'] 

cols = columns_list[:8] + temp_R_list + columns_list[13:]

df.columns = cols
0
Mayank Porwal 2 juin 2020 à 20:54