#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$