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
3 Réponses :
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$
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.
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
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.
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]