从熊猫数据框计算每年的病例数

时间:2021-05-26 16:20:19

标签: pandas dataframe

我有以下格式的数据框:

import pandas as pd
d = {'case_id': [1, 2, 3], 'begin': [2002, 1996, 2001], 'end': [2019, 2001, 2002]}
df = pd.DataFrame(data=d)

大约有 1,000 个案例。

我需要计算每年有多少有效案例。此信息可以从“开始”和“结束”列中获得。 例如,案例 2 在 1996 年和 2001 年之间生效。

生成的数据框应如下所示:

e = {'year': [1996, 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, 2006, 2007, 2008, 2009, 2010, 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019], 
'cases': [1, 1, 1, 1, 1, 2, 2, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1]}
df_ = pd.DataFrame(data=e)

知道如何用几行代码完成 1,000 个案例吗?

2 个答案:

答案 0 :(得分:1)

使用 range 然后 explode

分配新值
df['new'] = [range(x,y+1) for x , y in zip(df.begin,df.end)]
df = df.explode('new')

我们做 groupby + nunique

out = df.groupby(['new']).case_id.nunique().reset_index()
Out[257]: 
     new  case_id
0   1996        1
1   1997        1
2   1998        1
3   1999        1
4   2000        1
5   2001        2
6   2002        2
7   2003        1
8   2004        1
9   2005        1
10  2006        1
11  2007        1
12  2008        1
13  2009        1
14  2010        1
15  2011        1
16  2012        1
17  2013        1
18  2014        1
19  2015        1
20  2016        1
21  2017        1
22  2018        1
23  2019        1

答案 1 :(得分:1)

这是另一种方式:

df.assign(year = df.apply(lambda x: np.arange(x['begin'],x['end']+1),axis=1)).explode('year').groupby('year')['case_id'].count().reset_index()