Q1: Количество живых особей за данный год в данном возрасте и году:
Данный фрейм данных d1
как в вопросе выше:
d2 = \
pd.concat(\
d1.apply(\
lambda x: pd.DataFrame(\
{'id': x.name,\
'year': range(x['Birth_date'], x['Death_date']+1),\
'age': range(x['Birth_date'], x['Death_date']+1)-x['Birth_date']}),\
axis = 1).to_list())
d2
выглядит так:
id year age
0 0 1800 0
1 0 1801 1
2 0 1802 2
3 0 1803 3
4 0 1804 4
.. .. ... ...
24 3 1828 24
25 3 1829 25
26 3 1830 26
27 3 1831 27
28 3 1832 28
[159 rows x 3 columns]
id
представляет отдельного человека, выведенного из индекса d1
. Затем просто поверните d2
подсчет живых людей в данном возрасте и году:
nlvng = pd.pivot_table(d2, columns = 'age', index = 'year', values = 'id', aggfunc = 'count', fill_value=0)
набор результатов:
age 0 1 2 3 4 5 6 7 8 ... 62 63 64 65 66 67 68 69 70
year ...
1800 1 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0
1801 0 1 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0
1802 1 0 1 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0
1803 0 1 0 1 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0
1804 1 0 1 0 1 0 0 0 0 ... 0 0 0 0 0 0 0 0 0
.. .. .. .. .. .. .. .. .. ... .. .. .. .. .. .. .. .. ..
1876 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 1 0 0 0 0
1877 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 1 0 0 0
1878 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 1 0 0
1879 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 1 0
1880 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 1
[81 rows x 71 columns]
Q2: количество смертей за данный год в заданный возраст:
Здесь, используя ранее вычисленное d2
, объедините его с d1
на d1.index
и Death_date
:
d3 = d2.merge(d1, left_on = ['id','year'], right_on = [d1.index,'Death_date'], how = 'outer')
ndeaths = pd.pivot_table(d3, columns = 'age', index = 'year', values = 'Death_date', aggfunc = 'count', fill_value=0)
вывод:
age 0 1 2 3 4 5 6 7 8 ... 62 63 64 65 66 67 68 69 70
year ...
1800 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0
1801 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0
1802 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0
1803 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0
1804 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0
.. .. .. .. .. .. .. .. .. ... .. .. .. .. .. .. .. .. ..
1876 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0
1877 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0
1878 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0
1879 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 0
1880 0 0 0 0 0 0 0 0 0 ... 0 0 0 0 0 0 0 0 1
[81 rows x 71 columns]