やりたいこと
統計センターのオープンデータである「家計消費(SSDSE-C)」は、都道府県別で世帯あたり各食材品目の消費量をまとめているデータである。

このままのデータでも十分に有用であるが、都道府県によって平均世帯人員が異なるため、「1人あたりの消費量」を出すには数値項目を世帯人員で割る必要がある。用いる数値項目が1、2種類のみであればdfから列を個別に取り出して割れば良いが、項目が多くなると手数が増えそうなので一括で処理できるようにする。また処理対象は数値項目のみとし、文字項目はもとのdfのものをそのまま残すよう考慮する。
実装
import pandas as pd
import numpy as np
df = pd.read_csv('../00_data/SSDSE-C-2024.csv',skiprows=1)
df = df.drop(0)
df = df.reset_index()
df.head()

数値項目のリストを作成する。ここで除算に用いる項目は除外する。
# 数値列のみを選択('世帯人員'は除く)
numeric_cols = df.select_dtypes(include=['number']).columns.drop('世帯人員', errors='ignore')
numeric_cols

df_numericでdfから数値項目のみを取り出し、df.divで各数値項目を世帯人員で割る。
(indexを振り直す前の残骸も一緒に処理されている。実践に用いるときは消そう。)
# 数値列を'世帯人員'で割る
df_numeric = df[numeric_cols].div(df['世帯人員'], axis=0)
df_numeric.head()

dfから文字項目を取り出す。
# 数値以外の列をそのまま保持
non_numeric_cols = df.select_dtypes(exclude=['number']).columns
df_non_numeric = df[non_numeric_cols]
df_non_numeric.head()

処理済みの数値項目と文字項目を結合する。
# 数値列と非数値列を結合
df = pd.concat([df_non_numeric, df_numeric], axis=1)
df.head()
数値項目が各都道府県ごとの世帯人員で割られた、「1人あたりの消費量」のdfを作ることができた。

以上
コメント