Pandas разбивает один фрейм данных на несколько фреймов данных

#python #pandas

#pandas

Вопрос:

У меня есть один фрейм данных pandas, который мне нужно разбить на несколько фреймов данных. Количество фреймов данных, которые мне нужно разделить, зависит от того, сколько месяцев у меня данных, т. е. мне нужно создавать новый фрейм данных для каждого месяца. Поэтому df:

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

Итак, мне нужно создать 2 фрейма данных. Проблема в том, что я не знаю, на сколько месяцев у меня будут данные заранее.
Как мне это сделать

Ответ №1:

Вы можете использовать groupby для создания словаря фреймов данных,

 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$
  

Если ваши данные относятся к нескольким годам, вам нужно будет включить год в группировку

 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$
  

Комментарии:

1. Мне нравится ваш dict (tuple(groupby …). 1 Я добавляю это в свой набор инструментов.

2. Спасибо. Несмотря на указание format = ‘%Y%m’, почему MONTH изменился с 201801 на 2018-01-01?

3. @Victor, Pandas создает дату в формате Ymd, если компонент date отсутствует, он добавит 01 в качестве даты.

Ответ №2:

Вы можете использовать groupby для разделения фреймов данных в списке фреймов данных или словаре фреймов данных:

Словарь фреймов данных:

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

Список фреймов данных:

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

Или, как предлагает @BenMares, используйте понимание:

 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')

]
  

Комментарии:

1. Было бы намного элегантнее использовать понимание! {index: group_df for index, group_df in df.groupby('MONTH')}

2. Согласованное понимание по словарю. Приятно, @BenMares.

Ответ №3:

Вы также можете использовать словарь локальной переменной vars() таким образом:

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

каждый фрейм данных создается под именем df_month. Например:

df_201801

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