1
votes

Créer une nouvelle base de données pour chaque niveau de facteur dans la colonne

Il y a plus de 50 niveaux différents dans une colonne, et chaque niveau doit être divisé en son propre cadre de données et écrit dans un fichier (Excel ou CSV).

J'ai vu cela comme une solution possible:

df1, df2, df3, df4 = [x for _, x in df.groupby(df['column_of_interest'])]

mais y a-t-il un moyen de ne pas coder en dur le nombre de blocs de données?


0 commentaires

3 Réponses :


2
votes

Existe-t-il un moyen de ne pas coder en dur le nombre de blocs de données?

Oui, il y en a. Utilisez un dictionnaire ou une liste. En utilisant dict:

for idx, (value, x) in enumerate(df.groupby('column_of_interest'), 1):
    x.to_csv(f'slice_{value}.csv')  # include value in filename
    x.to_csv(f'slice_{idx}.csv')    # include numeric index in filename

Accédez ensuite à vos dataframes via dfs [1] , dfs [2] , etc.

Vous pouvez également utiliser list:

dfs = [x for _, x in df.groupby('column_of_interest')]

Ensuite, utiliser dfs [0] , dfs [1] , etc.

Si vous n'avez pas besoin de stocker vos tranches de dataframe, itérez simplement un groupby et utilisez to_csv . Ceci est pratique avec les chaînes f ( PEP 498 , Python 3.6+) :

dfs = {i: x for i, (_, x) in enumerate(df.groupby('column_of_interest'), 1)}

0 commentaires

0
votes

Vous pouvez enregistrer les dataframes directement

for val, df1 in df.groupby(df['column_of_interest']):
    #Write the df1 to csv or excel
    df1.to_csv("coi_%s.csv"%val)

Ou avec une boucle for explicite

[df1.to_csv("coi_%s.csv"%val) for val, df1 in df.groupby(df['column_of_interest'])]


1 commentaires

Cela a fonctionné. J'avais besoin de sauvegarder le csv au niveau de la colonne. Merci!



0
votes

Une façon peut faire cela en utilisant locaux mais pas de recommandation, je pense personnellement que la réponse de jpp est la bonne façon pour ce type de demande.

variables = locals()
for key,value in df.groupby(df['column_of_interest']):
    variables["df{0}".format(key)]= value


0 commentaires