У меня есть фрейм данных, содержащий 2 даты, которые я хочу отображать как индекс и столбцы в сводной таблице Pandas.
Вот таблица с данными:
df1 = pd.DataFrame({'client_id': {0: 1,
1: 2,
2: 3,
3: 4,
4: 5,
5: 6,
6: 7,
7: 8,
8: 9,
9: 10,
10: 11,
11: 12,
12: 13,
13: 14},
'created_date': {0: '14/05/2020',
1: '15/05/2020',
2: '16/05/2020',
3: '19/05/2020',
4: '21/05/2020',
5: '29/05/2020',
6: '30/05/2020',
7: '03/06/2020',
8: '04/06/2020',
9: '05/06/2020',
10: '06/06/2020',
11: '07/06/2020',
12: '08/06/2020',
13: '09/06/2020'},
'subscr_date': {0: '29/05/2020',
1: '01/06/2020',
2: '21/06/2020',
3: '23/06/2020',
4: '24/06/2020',
5: '25/06/2020',
6: '26/06/2020',
7: '27/06/2020',
8: '28/06/2019',
9: '29/06/2020',
10: '30/06/2020',
11: '01/07/2022',
12: '02/07/2020',
13: '03/07/2021'}})
Используя приведенный ниже код, я смог создать сводную таблицу Pandas, отображающую 2 поля даты в виде индекса и столбца, однако проблема в том, что я хочу, чтобы данные передискретизировались в данные месяцев, а не дней, как сейчас.
Я пытаюсь использовать .resample('M'), но получаю сообщение об ошибке "Действительно только с DatetimeIndex, TimedeltaIndex или PeriodIndex, но есть экземпляр 'Int64Index'". Я уверен, что оба моих поля даты имеют формат Datetime.
Вот мой код:
pd.pivot_table(data = df1, index =df1['created_date'].resample('M'), columns =df1['subscr_date'].resample('M'),
aggfunc='count', values ='client_id', fill_value = 0)
Любая помощь высоко ценится! Спасибо!
Используйте Grouper
для повторной выборки по месяцам с преобразованием столбцов в дату и время:
df1['created_date'] = pd.to_datetime(df1['created_date'], dayfirst=True)
df1['subscr_date'] = pd.to_datetime(df1['subscr_date'], dayfirst=True)
df1 = df1.groupby([
pd.Grouper(freq='M', key='created_date'),
pd.Grouper(freq='M', key='subscr_date')
]).size().unstack(fill_value=0)
print(df1)
subscr_date 2020-05-31 2020-06-30 2019-06-30 2020-07-31 2021-07-31 \
created_date
2020-05-31 1 6 0 0 0
2020-06-30 0 3 1 1 1
subscr_date 2022-07-31
created_date
2020-05-31 0
2020-06-30 1
Или:
df1 = df1.pivot_table(index=pd.Grouper(freq='M', key='created_date'),
columns=pd.Grouper(freq='M', key='subscr_date'),
aggfunc='count',
values='client_id',
fill_value=0)
print(df1)