結論
pd.read_csv
でデータを読み込む際にskiplows
オプションを指定する。
df = pd.read_csv(data, skiplows=low_number)
背景
オープンデータの中には、不要なメタデータ行やヘッダー行が含まれている場合がある。
データ取得と加工を同時に行わない場合、ダウンロードした元データを直接編集することもできる。多くの場合、こちらの方法の方が簡単かつ再利用しやすい。
一方、これらを同時に行いたい場合、プログラムの中でヘッダーを無視する方法を検討する必要がある。
以下のデータは、e-Stat apiを使用して取得した「年齢(3区分),男女別人口及び年齢別割合 - 都道府県,市区町村(令和2年) 北海道 ~ 沖縄県」である。e-Stat apiではjsonとcsvの二つの形式でデータが与えられているが、以下はcsv形式で取得したものである。
これをみると、本来利用したいデータ以外にも、統計実施期間や統計表名といったメタデータが記載されていることが確認できる。
"SURVEY_DATE","202001-202012"
"OPEN_DATE","2022-03-31"
"SMALL_AREA","0"
"COLLECT_AREA","該当なし"
"MAIN_CATEGORY","02","人口・世帯"
"SUB_CATEGORY","01","人口"
"OVERALL_TOTAL_NUMBER","41244"
"UPDATED_DATE","2024-09-30"
"STATISTICS_NAME_SPEC","時系列データ","男女,年齢,配偶関係","","","",""
"TITLE_SPEC","","年齢(3区分),男女別人口及び年齢別割合 - 都道府県,市区町村(令和2年) 北海道 ~ 沖縄県","1) 年齢(3区分)の「総数」には、年齢「不詳」の者を含む。<br>2) 割合は、年齢「不詳」の者を除いて算出している。","","",""
"NOTE","***","当該数値がないもの"
...
"020","人口","100","総数","100","総数","01108","札幌市厚別区","2020000000","2020年","人","125083",""
"020","人口","100","総数","100","総数","01109","札幌市手稲区","2020000000","2020年","人","142625",""
"020","人口","100","総数","100","総数","01110","札幌市清田区","2020000000","2020年","人","112355",""
"020"
データ読み込み
pd.read_csv()
でデータを読み込む際にskiplows
引数を指定する。引数はint
型を。
また、同様に末尾複数行をスキップするskipfooter()
もある。
以下のコードは、先述の文字列を読み込むことを想定した例である。StringIo(text)
を利用してテキストファイルと同様にpd.read_csv()
を使えるようにしている。また、区切り文字を認識するために、sep=","
を設定している。
data = StringIo(text)
try:
df = pd.read_csv(data, sep=",", encoding='utf-8', skiprows=27)
except pd.errors.ParserError as e:
print("Error parsing CSV:", e)