Как использовать pandas для создания столбца, в котором хранится количество первых вхождений в group-by?

#python #python-3.x #pandas #dataframe #pandas-groupby

#python #python-3.x #pandas #dataframe #pandas-groupby

Вопрос:

Q1. Учитывая фрейм данных 1, я пытаюсь получить групповые уникальные новые появления и другой столбец, который дает мне существующее количество идентификаторов в месяц

 ID     Date
1    Jan-2020
2    Feb-2020
3    Feb-2020
1    Mar-2020
2    Mar-2020
3    Mar-2020
4    Apr-2020
5    Apr-2020
  

Ожидаемый результат для уникальных вновь добавленных значений идентификатора группы по и для существующей суммы значений идентификатора

 Date       ID_Count   Existing_count
Jan-2020      1           0
Feb-2020      2           1  
Mar-2020      0           3
Apr-2020      2           3
  

Примечание: ID_Count за март 2020 равен НУЛЮ, поскольку идентификаторы 1, 2 и 3 присутствовали в предыдущие месяцы.

Примечание: Существующее количество равно 0 для января 2020 года, потому что до января было ноль идентификаторов. Существующее количество для февраля-2020 равно 1, потому что до февраля было только 1. В марте-2020 есть 3 существующих количества, поскольку оно добавляет январь февраль и так далее

Ответ №1:

Я думаю, вы можете сделать это следующим образом:

 df['month'] = pd.to_datetime(df['Date'], format='%b-%Y')

# Find new IDs
df['new'] = df.groupby('ID').cumcount()==0

# Count new IDs by month
df_ct = df.groupby('month')['new'].sum().to_frame(name='ID_Count')

# Count all previous new IDs
df_ct['Existing_cnt'] = df_ct['ID_Count'].shift().cumsum().fillna(0).astype(int) 
df_ct.index = df_ct.index.strftime('%b-%Y')
df_ct
  

Вывод:

           ID_Count  Existing_cnt
month                           
Jan-2020         1             0
Feb-2020         2             1
Mar-2020         0             3
Apr-2020         2             3
  

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

1. Сработало как по волшебству. Я получил существующее количество, но застрял из-за первого шага. Спасибо за помощь!