python - 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 年的年龄值。谁能帮我解决这个问题?
解决方案
为什么不得到一个年份列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
,您应该可以将年份放入列中。
推荐阅读
- html - 创建画布和连续线
- json - JSON解析dataTaskWithUrl返回0字节数据
- java - 果汁注射器抛出空指针异常
- javascript - 如何更改麦克风实时音频的播放速度(使用缓冲区)?
- java - 如何使用 Java 在 MySQL 表中仅搜索一条特定记录
- c# - C# webjob convert.todouble 在 azure 上工作错误
- c# - 为 json 创建和填充数据
- java - Jhipster Docker prod build 在执行 JUnit 测试时抛出“java.lang.OutOfMemoryError:GC 开销限制超出”
- combinations - 31 是从 1 到 18 的 4 个不同数字的总和
- php - Laravel LogServiceProvider 不会让请求通过