データの整然化の例

e-Statの人口動態調査の確定数→死亡→年次→2020年とたどって,5-4「死亡月別にみた年次別死亡数及び死亡率(人口千対)」をCSV形式でダウンロードし,Excelで開く:

mc040000.csv

これは整然データになっていない。これを次のような整然データに直したい。ただし,5個の「不詳」は無視する。

死亡数
19471109940
19472115405
19473116996

次のようにすればよい:

import pandas as pd

df = pd.read_csv('mc040000.csv', encoding='cp932', skiprows=5, nrows=28)
df.columns = ['年次', '年', '総数'] + list(range(1, 13)) + ['不詳']
df = df.melt(id_vars=['年'], value_vars=range(1, 13),
             var_name='月', value_name='死亡数')
df['月'] = df['月'].astype(int)
df = df.sort_values(by=['年', '月'])
df
        年   月       死亡数
0    1947   1  109940.0
28   1947   2  115405.0
56   1947   3  116996.0
84   1947   4   99403.0
112  1947   5   92456.0
..    ...  ..       ...
223  2020   8  111141.0
251  2020   9  106345.0
279  2020  10  116951.0
307  2020  11  117607.0
335  2020  12  132148.0

逆にこの表を元のように2次元に戻すには次のようにする:

pd.pivot_table(df, values="死亡数", columns="月", index="年")
月           1         2         3         4   ...        9         10        11        12
年                                             ...                                        
1947  109940.0  115405.0  116996.0   99403.0  ...   79305.0   77592.0   78563.0   92232.0
1950   91367.0   81463.0   88905.0   71320.0  ...   66578.0   66830.0   67701.0   90629.0
1955   72754.0   63206.0   64545.0   58779.0  ...   50331.0   53397.0   57304.0   62089.0
(後略)