1
votes

Comment réorganiser les n premières colonnes de dataframe et ajouter les colonnes restantes à la fin?

Imprévisiblement formaté df :

  First Name  other   number last_name
0    Cthulhu    NaN      666     Smith

desired_df = pd.DataFrame({'First Name': ['Cthulhu'], 'other': [np.nan], 'number': [666], 'last_name': ['Smith']})

Cela doit être mis dans les noms et l'ordre des colonnes: TemplateColumns = ['First Name', 'other', 'number'] . Si les colonnes n'existent pas, elles peuvent être créées:

  First Name  number last_name  other
0    Cthulhu     666     Smith    NaN

Qui donne:

for col in TemplateColumns:
    if col not in df:
        df[col] = np.nan

Et les colonnes initiales doivent être ordonnées de la même manière que TemplateColumns , en laissant les colonnes restantes à la fin, pour obtenir le desired_df :

  First Name  number last_name
0    Cthulhu     666     Smith
    
df = pd.DataFrame({'First Name': ['Cthulhu'], 'number': [666], 'last_name': ['Smith']})

La réorganisation des colonnes estbien expliquée dans d'autres articles , mais je ne sais pas comment ordonner les n premières colonnes et conserver le reste à la fin. Comment puis-je faire ceci?


0 commentaires

3 Réponses :


0
votes

Utilisez l' insert comme ceci:

for col in TemplateColumns:
    if col not in df:
        df.insert(1, col, np.nan)


4 commentaires

@ChrisDixon Pas de problème, n'oubliez pas d'accepter et de voter pour tho 😊


Suppression du premier commentaire car vous avez réalisé que votre suggestion n'a pas résolu le problème. La deuxième colonne doit être «autre».


@ChrisDixon changez votre TemplateColumns = ['First Name', 'other', 'numbers'] en TemplateColumns = ['First Name', 'other', 'number']


J'ai corrigé la faute de frappe «nombres», et bien que cela fonctionne pour cet exemple simplifié, cela ne laisse les colonnes dans le bon ordre que par coïncidence. Les colonnes doivent être réorganisées.



1
votes

Vous pouvez écrire votre propre fonction pour y parvenir. Essentiellement, vous pouvez utiliser .reindex() pour réorganiser le dataframe tout en incluant des colonnes vides si elles n'existent pas. La seule partie restante à comprendre serait de savoir comment ajouter les colonnes restantes non dans TemplateColumns à votre dataframe. Vous pouvez le faire en obtenant la différence définie de l'index de colonne à partir des TemplateColumns puis en mettant à jour l'ordre avant votre appel à .reindex

Configurer les données et la fonction

out = reordered(df, new_order, include_remaining=False)

print(out)
  First Name  other  number
0    Cthulhu    NaN     666

avec include_remaining :

out = reordered(df, new_order, include_remaining=True)

print(out)
  First Name  other  number last_name
0    Cthulhu    NaN     666     Smith

sans include_remaining :

def reordered(df, new_order, include_remaining=True):
    cols_to_end = []
    if include_remaining:
        # gets the items in `df.columns` that are NOT in `new_order` 
        cols_to_end = df.columns.difference(new_order, sort=False)
    
    # Ensures that the new_order items are first
    final_order = new_order + list(cols_to_end)
    return df.reindex(columns=final_order)

df = pd.DataFrame({'First Name': ['Cthulhu'], 'number': [666], 'last_name': ['Smith']})
new_order = ['First Name', 'other', 'number']


1 commentaires

Fonctionne bien mais la solution de @ andy-l est plus élégante. Merci beaucoup quand même!



1
votes

Essaye ça

cols = TemplateColumns + df.columns.difference(TemplateColumns, sort=False).tolist()
df_final =  df.reindex(cols, axis=1)

Out[714]:
  First Name  other  number last_name
0    Cthulhu    NaN     666     Smith


0 commentaires