4
votes

Les pandas divisent un dataframe en plusieurs dataframes

J'ai un dataframe pandas que je dois diviser en plusieurs dataframes. Le nombre de dataframes que je dois diviser dépend du nombre de mois de données dont je dispose, c'est-à-dire que je dois créer un nouveau dataframe pour chaque mois. Donc df:

MONTH   NAME INCOME
201801   A     100$
201801   B      20$
201802   A      30$

J'ai donc besoin de créer 2 dataframes. Le problème est que je ne sais pas combien de mois de données j'aurai à l'avance. Comment faire ça


0 commentaires

3 Réponses :


6
votes

Vous pouvez utiliser groupby pour créer un dictionnaire de blocs de données,

dfs = dict(tuple(df.groupby([df['MONTH'].dt.year,df['MONTH'].dt.month])))
dfs[(2018, 1)]

    MONTH      NAME INCOME
0   2018-01-01  A   100$
1   2018-01-01  B   20$

Si vos données portent sur plusieurs années, vous devrez inclure l'année dans le regroupement

df['MONTH'] = pd.to_datetime(df['MONTH'], format = '%Y%m')
dfs = dict(tuple(df.groupby(df['MONTH'].dt.month)))
dfs[1]


    MONTH   NAME    INCOME
0   2018-01-01  A   100$
1   2018-01-01  B   20$


3 commentaires

J'aime votre dict (tuple (groupby ...). +1 J'ajoute ça à ma boîte à outils.


Je vous remercie. Malgré la spécification du format = '% Y% m', pourquoi MONTH a-t-il changé de 201801 au 2018-01-01?


@Victor, Pandas crée la date au format Ymd, si le composant de date est manquant, il ajoutera 01 comme date.



3
votes

Vous pouvez utiliser groupby pour diviser les dataframes en une liste de dataframes ou un dictionnaire de dataframes:

Dictionary of dataframes:

dict_of_dfs = {

    month: group_df 

    for month, group_df in df.groupby('MONTH') 

}


list_of_dfs = [

    group_df 

    for _, group_df in df.groupby('MONTH')

]

Liste des dataframes:

list_of_dfs = []
for _, g in df.groupby(df['MONTH']):
    list_of_dfs.append(g)

Ou comme @BenMares suggère d'utiliser la compréhension:

dict_of_dfs = {}
for n, g in df.groupby(df['MONTH']):
    dict_of_dfs[n] = g


2 commentaires

Il serait bien plus élégant d'utiliser une compréhension! {index: group_df pour l'index, group_df dans df.groupby ('MONTH')}


Compréhension convenue du dictionnaire. Bien, @BenMares.



2
votes

Vous pouvez également utiliser le dictionnaire de variables locales vars () de cette manière:

    MONTH   NAME    INCOME
0   201801  A   100$
1   201801  B   20$

chaque DataFrame est créé sous le nom df_month. Par exemple:

df_201801

for m in df['MONTH'].unique():
    temp = 'df_{}'.format(m)    
    vars()[temp] = df[df['MONTH']==m]


0 commentaires