Почему бы не получить столбец года, например 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
, вывод:
Как только это будет сделано, pd.pivot_table
позволит вам поместить годы в столбцы.