Python Pandas GroupBy: вычисление возраста путем вычитания даты из последних 10 лет - PullRequest
0 голосов
/ 29 мая 2020

У меня есть фрейм данных, который выглядит следующим образом:

df:

   ID             DATE  
     KV          26/09/1969 0:00:00         
     KV          27/05/1970 0:00:00         
     KV          17/01/1989 0:00:00        
     KV          27/05/1970 0:00:00        
     DV          24/07/1984 0:00:00         
     DV          11/03/2015 0:00:00        
     DV           4/12/2015 0:00:00         
     GV          26/10/2005 0:00:00         
     GV          11/10/2017 0:00:00         
     GV          11/10/2017 0:00:00    

Теперь я хочу создать столбец среднего возраста для каждого идентификатора за последние 10 лет (с использованием groupby).

Желаемый результат:

Average Age
ID  2020    2019    2018    2017    2016    2015    2014    2013    2012    2011
KV  45.5    44.5    43.5    42.5    41.5    40.5    39.5    38.5    37.5    36.5
DV  15.3    14.3    13.3    12.3    11.3    31       30      29      28      27
GV  3        2       1       0      0        0      0         0       0       0           

Возраст может быть рассчитан путем вычитания последних 10 лет из столбца даты. Я использовал следующую команду для расчета возраста на 2020 год:

df.groupby('ID')['Date'].agg(lambda x:pd.datetime('01-04-2020')-x['Date']) 

Однако я не могу понять, как рассчитать возрастное значение за последние 10 лет с помощью одной команды. Может ли кто-нибудь помочь мне, как подойти к этой проблеме?

1 Ответ

0 голосов
/ 29 мая 2020

Почему бы не получить столбец года, например df['Year'] = pd.to_datetime(df['Date']).dt.year, а затем сделать groupby на обоих ['ID','Year'], например:

import pandas as pd

def parse_date(td):
    ### no leap-year in account
    resYear = float(td.days)/365.0                   
    resMonth = int((resYear - int(resYear))*365/30) 
    resYear = int(resYear)
    return str(resYear) + "Y" + str(resMonth) + "m"

df = pd.DataFrame([['KV','26/09/1969 0:00:00'],['KV','26/09/1979 0:00:00'],['KV','26/09/1989 0:00:00'],['DV','26/09/1984 0:00:00'],['GV','26/09/2014 0:00:00']],columns=['id','date'])
df['date'] = pd.to_datetime(df['date'])
df['year'] = df['date'].dt.year
df['age'] = df.groupby(['id','year'])['date'].apply(lambda x:pd.to_datetime('today')-x).reset_index()['date'].apply(parse_date)
df

, вывод:

enter image description here

Как только это будет сделано, pd.pivot_table позволит вам поместить годы в столбцы.

...