Групповой счет на основе года и заданного условия c - PullRequest
0 голосов
/ 25 января 2020

У меня есть датафрейм, как показано ниже

Tenancy_ID        Unit_ID        Tenancy_End_Date
1                 A              2012-09-06 11:34:15
2                 B              2013-09-08 10:35:18
3                 A              2014-09-06 11:34:15
4                 C              2014-09-06 11:34:15
5                 B              2015-09-06 11:34:15
6                 A              2014-09-06 11:34:15
5                 A              2015-09-06 11:34:15
7                 A              2019-09-06 11:34:15
4                 C              2014-01-06 11:34:15
5                 C              2014-05-06 11:34:15

Исходя из вышеизложенного, я хотел бы создать нижеприведенный фрейм данных

Ожидаемый результат:

Unit_ID    NoC_2012   NoC_2013  NoC_2014   NoC_2015   NoC_2016   NoC_2017  NoC_2018   NoC_2019
A          1          0         2          1          0          0         0          1
B          0          1         0          1          0          0         0          0
C          0          0         3          0          0          0         0          0

Где Нет C = количество контрактов.

Например, NoC_2012 = Количество контрактов в 2012 году на основе Tenancy_End_Date

Примечание. Tenancy_ID не является уникальным. Tenancy_ID с Unit_ID является уникальным. ie один и тот же Tenancy_ID с другим Unit_ID.

1 Ответ

2 голосов
/ 25 января 2020

Сначала преобразуйте в datetime ваши столбцы:

df['Tenancy_End_Date']= pd.to_datetime(df['Tenancy_End_Date'])

, затем используйте DataFrame.pivot_table с Series.dt.year, чтобы получить Годы :

new_df = (df.assign(Year  = df['Tenancy_End_Date'].dt.year)
           #if you don't want convert to datetime use this instead
           #.assign(Year  = pd.to_datetime(df['Tenancy_End_Date']).dt.year)
            .pivot_table(index = 'Unit_ID',
                         columns = 'Year',
                         values = 'Tenancy_ID'
                         ,aggfunc = 'count',
                         fill_value =0)
            .add_prefix('NoC_')
            .reset_index()
            .rename_axis(columns = None))
print(new_df)
  Unit_ID  NoC_2012  NoC_2013  NoC_2014  NoC_2015  NoC_2019
0       A         1         0         2         1         1
1       B         0         1         0         1         0
2       C         0         0         3         0         0
...