Python:Pandasでデータを最終行(先頭行)に追加する

その買うを、もっとハッピーに。|ハピタス

Pandasでデータを最終行もしくは先頭行にappend(アペンド)する方法を、2021年7月の出生数が発表されていたみたいなので、早速、この2021年7月のデータを1月〜6月までのデータにアペンドして、2020年1月〜7月の出生数と比較してみることにしました。 結論から言うと、2021年7月の出生数も前年同月の出生数を上回ることはできませんでした。ここまでは、在宅勤務効果や、政府のバラマキ効果は出ていないようです。

スポンサーリンク

Pandasでデータを追加する方法を考察する

データを追加する方法について、あれこれ考察してみたいと思います。先ず手始めに、2021年の出生数データをダウンロードします。

import pandas as pd
from tabula import read_pdf

df = read_pdf("https://www.mhlw.go.jp/toukei/saikin/hw/jinkou/geppo/s2021/dl/202107.pdf",
             pages = '3',
             multiple_tables=False,
             stream=True)
df3=df[0]
df3.head(3)
Unnamed: 0 都道府県 出 生 数 死 亡 数 死 産 数 婚姻件数 離婚件数
0 NaN 全 国 74 263 112 222 1 336 42 510 14 377
1 01 北 海 道 2 582 5 687 53 1 576 664
2 02 青 森 623 1 503 14 289 146

2021年1月〜6月までのデータをロードします。

df5 = pd.read_csv('numofbirths2021.csv')
df5.head(3)
都道府県 出 生 数 死 亡 数 死 産 数 婚姻件数 離婚件数
0 1 全 国 63 742 140 844 1 404 38 851 14 762
1 2 全 国 59 789 118 984 1 399 44 800 15 097
2 3 全 国 69 446 123 579 1 613 62 406 22 530

2021年7月のデータのUnnamed: 0を月に変更します。

df3.rename(columns={'Unnamed: 0':'月'}, inplace = True)
df3.head(2)
都道府県 出 生 数 死 亡 数 死 産 数 婚姻件数 離婚件数
0 NaN 全 国 74 263 112 222 1 336 42 510 14 377
1 01 北 海 道 2 582 5 687 53 1 576 664

月を7月にします。

df3.loc[:0, "月"] = "7"
df3.head(2)
都道府県 出 生 数 死 亡 数 死 産 数 婚姻件数 離婚件数
0 7 全 国 74 263 112 222 1 336 42 510 14 377
1 01 北 海 道 2 582 5 687 53 1 576 664

df5の最終行にdf3の先頭行を追加します。

df2 = df5.append(df3.loc[:0], ignore_index=True)
df2.tail(2)
都道府県 出 生 数 死 亡 数 死 産 数 婚姻件数 離婚件数
5 6 全 国 71 031 108 734 1 454 40 324 15 432
6 7 全 国 74 263 112 222 1 336 42 510 14 377

先頭行に追加する場合は以下のようにします。

df4 = pd.concat([df3.loc[:0], df5], ignore_index=True)
df4.head(2)
都道府県 出 生 数 死 亡 数 死 産 数 婚姻件数 離婚件数
0 7 全 国 74 263 112 222 1 336 42 510 14 377
1 1 全 国 63 742 140 844 1 404 38 851 14 762
スポンサーリンク

2021年1月〜7月の出生数をグラフ化

2021年1月〜7月の出生数と2020年の出生数をグラフ化します。最初に2020年の出生数データをロードします。

df6 = pd.read_csv('numofbirths2020.csv')
df6.head(2)
都道府県 出 生 数 死 亡 数 死 産 数 婚姻件数 離婚件数
0 1 全 国 74 672 132 622 1 661 37 668 16 827
1 2 全 国 66 639 117 010 1 510 74 147 16 627

このままだとグラフ化できないので、データに前処理を施します。

df6 = df6.replace(r'[,\"\']','', regex=True).replace(r'\s*([^\s]+)\s*', r'\1', regex=True)
df6 = df6.apply(pd.to_numeric, errors="ignore")
df2 = df2.replace(r'[,\"\']','', regex=True).replace(r'\s*([^\s]+)\s*', r'\1', regex=True)
df2 = df2.apply(pd.to_numeric, errors="ignore")

両データを保存しておきます。

df6.to_csv('numofbirths2020_2.csv', index=False)
df2.to_csv('numofbirths2021_2.csv', index=False)

グラフにします。

from matplotlib.pyplot import *
from matplotlib.font_manager import FontProperties
from matplotlib import rcParams
style.use('ggplot')

fp = FontProperties(fname='/usr/share/fonts/opentype/ipaexfont-gothic/ipaexg.ttf', size=54)
rcParams['font.family'] = fp.get_name()
rcParams["font.size"] = "20"
fig, ax = subplots(figsize=(25,13))

df6.loc[0:6,['月','出 生 数']].set_index('月').plot(ax=ax,kind='barh',color='g',alpha=0.5,  position=1, width=.25)
df2.loc[0:6,['月','出 生 数']].set_index('月').plot(ax=ax,kind='barh',color='r',alpha=0.5, position=0, width=.25)


xticks(np.arange(0,1.1e5,1e4),
   ['{}万'.format(int(x/1e4)) if x > 0 else 0 for x in np.arange(0,1.1e5,1e4)]);
for i in ax.patches:
    ax.text(i.get_width()+2.5e2,i.get_y()+.185,\
      '{:,}人'.format(int(round((i.get_width()), 2))), fontsize=20, color='k')
ax.legend(["出生数(2020)","出生数(2021)"],loc='best', prop={'size': 26});
ax.invert_yaxis();

2021年7月も前年割れしてしまっていますが、数字はそれ程落ち込んではいないので、8月以降に期待がもてそうです。とは言っても、2021年の出生数が80万人割れするのは必至で、来年のニュースの見出しに、「出生数80万人割れの衝撃!」が載ることになります。日本はそろそろ真剣に移民・難民の大量受け入れをする議論をする時期に来ています。実際は、議論の余地もない程に深刻な状況に陥ってしまっているのですが、あらゆる面で、政治不在という現状が、この国の本当の悲劇だと言えます。

スポンサーリンク
スポンサーリンク