Kの備忘録(仮)

Python、VBA、Excelを中心に記事を投稿

Pythonのpandasを使ってデータ加工してみる

はじめに

前回までに、VBA配列とEnumステートメントの活用についてを書きました。

VBA配列とEnumステートメントの活用1 - Kの備忘録(仮)

VBA配列とEnumステートメントの活用2 - Kの備忘録(仮)

今回は、Pythonで同じデータ加工を行う場合、どんな感じのコードになるのかを試してみます。使用するのはpandasというデータ加工に特化したライブラリです。

今回用意したデータ

前回と同じく、e-Statで公開されている2020年の国税調査結果の「人口速報集計(男女別人口及び世帯総数)」に手を加えたExcelファイルを使用します。

f:id:lbibouroku:20220219224242p:plain

ただし、書き込みは前回と異なり、新しいExcelを作成して転記します。理由は後述します。

データの詳細は上記「VBA配列とEnumステートメントの活用1」の記事のe-Statのリンクにてご確認ください。

また、今回はJupyter Notebookを使用します。

今回やりたい処理

こちらはほぼ前回の条件と同じですが、転記先は「新しいExcel ファイル」に変更します。

◆転記項目

  • 地域識別コード
  • 都道府県
  • 人口/総数
  • 人口/男
  • 人口/女
  • 人口密度
  • 世帯数

「a01」シートの「地域識別コードが「a」の項目かつ、上記7項目のみ新しいExcel ファイルを作成し「都道府県別総人口」シートへ転記する

pandasライブラリを使用したコード

import pandas as pd

path = 'Enum検証国税調査2020年pandas01.xlsx'
df = pd.read_excel(path, sheet_name='a01')

df2 = df[df['地域識別コード'] == 'a']
df2 = df2[['地域識別コード', '都道府県', '人口/_総数', '人口/男', '人口/女', '人口密度', '世帯数']]

path2 = 'Enum検証国税調査2020年pandas02.xlsx'
df2.to_excel(path2, sheet_name='都道府県別総人口', index=False, )

コード短い・・・!特別なメソッドなどを使わなくても簡単にデータ抽出して転記できてしまいました。

「どの項目が転記対象か」ということも一目でわかりますね。全体的にコメント書かなくても可読性に問題ないと思います。

解説

Jupyter Notebookでセルを分けて、データの状況を確認していきます。

import pandas as pd

path = 'Enum検証国税調査2020年pandas01.xlsx'
df = pd.read_excel(path, sheet_name='a01')
df.columns

ここでセルを区切って実行すると、以下のように項目(columns)が確認できます。

Index(['地域識別コード', '都道府県', '地域名', '人口/_総数', '人口/男', '人口/女',
       '2015年(平成27年)の人口(組替)', '5年間の人口増減数', '5年間の人口増減率', '人口性比', '面積(参考)',
       '人口密度', '世帯数', '2015年(平成27年)の世帯数(組替)', '5年間の世帯増減数', '5年間の世帯増減率'],
      dtype='object')

転記元データの項目名が問題なく取得できていますね。

次のセルを実行します。

df2 = df[df['地域識別コード'] == 'a']
df2 = df2[['地域識別コード', '都道府県', '人口/_総数', '人口/男', '人口/女', '人口密度', '世帯数']]
df2 

転記用に「df2」というデータフレームを用意して、対象のレコード(この場合「地域識別コードが「a」の項目)を抽出し、さらに対象の7つのcolumnsを指定しています。

df2の内容は以下のとおりです。

f:id:lbibouroku:20220220193001p:plain

↓の前回のVBAの検証のときと同じ内容ですね!(一番左は「dfのindex」なので、気にしなくて大丈夫です)

f:id:lbibouroku:20220219223657p:plain

次のセルを実行します。

path2 = 'Enum検証国税調査2020年pandas02.xlsx'
df2.to_excel(path2, sheet_name='都道府県別総人口', index=False, )

出力したExcel ファイルを確認すると、正しくデータは転記できているのですが、1行目の太字と罫線が気になります・・・。データフレームをExcelファイルに書き込むとこうなってしまうので仕方ないです・

f:id:lbibouroku:20220220192050p:plain

また、pandasのto_excelメソッドでExcel ファイルを書き出すと指定したシート以外消えるという恐ろしい仕様があるので注意です!!!

おそらく他のライブラリを使えばPythonでもちゃんと転記できると思うのですが、今回はデータ加工の部分に重きを置いたため、転記元と同じExcelファイルへの書き出しの諦めました。

pandasについて思ったこと

pandasは少しだけ使ったことがあるのですが、今回のことも含め簡単まとめると以下の3点です。

  • Pythonで表形式のデータ加工するなら、最強のライブラリなのでは?
  • csvファイルの読み書きなら、エンコードに気をつければ問題なさそう
  • Excelファイルの書き出しにクセがある

おわりに

「pandasすごいですね」って改めて思いました。それ以上の言葉が出ない・・・。

次回はとうとうPythonのリストとenumクラスの検証を行います!これがやりたかったので楽しみです!