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?
3 Réponses :
Utilisez l' insert
comme ceci:
for col in TemplateColumns: if col not in df: df.insert(1, col, np.nan)
@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.
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']
Fonctionne bien mais la solution de @ andy-l est plus élégante. Merci beaucoup quand même!
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