首页 > 解决方案 > Python Pandas GroupBy:通过从过去 10 年中减去日期来计算年龄

问题描述

我有如下所示的数据框:

东风:

   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 年的每个 ID 创建一个平均年龄列(使用 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 年的年龄值。谁能帮我解决这个问题?

标签: pythonpython-3.xpandaspandas-groupby

解决方案


为什么不得到一个年份列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,您应该可以将年份放入列中。


推荐阅读