Повторная выборка DataFrame в сводной таблице Pandas

У меня есть фрейм данных, содержащий 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 поля даты в виде индекса и столбца, однако проблема в том, что я хочу, чтобы данные передискретизировались в данные месяцев, а не дней, как сейчас.

Повторная выборка DataFrame в сводной таблице Pandas

Я пытаюсь использовать .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)

Любая помощь высоко ценится! Спасибо!

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
25
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Используйте 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)

Другие вопросы по теме