はじめに
pandas の read_csv で CSV を読み込む際に発生する DtypeWarning について、原因と対処法を実務経験をもとにまとめました。この記事では、代表的な対処法とそのメリット・デメリットを整理し、どの場面でどちらを選ぶべきか判断できるようになります。
この記事でわかること
- DtypeWarningが発生する理由
- 代表的な対処法2つ
- それぞれのメリット・デメリット
- 実務でどちらを選ぶべきか
read_csvとDtypeWarning
read_csvは pandasを使用するうえで基本的な関数ですが、それ故にこの関数に紐づいた警告やエラーは実務でもよく見ることが多いです。私は実務にて大規模な情報処理システム開発プロジェクトに参画していますがそれに付随して大規模なcsvファイルを読み込むことが頻繁にあります。その際に発生する警告 DtypeWarningは頻発していました。警告レベルのため、対処は必須レベルではありませんが意図しない動作を起こす可能性を排除できないです。そのため、警告を回避する対処は推奨されます。
警告原因
大規模なcsvファイルを読み込む際にデフォルトではメモリ消費を抑えるためにデータをチャンク(小さな分割)で部分読み込みして、チャンクごとに型を推定して型を確定する処理を行います。この時にチャンク間でデータが異なるとDtypeWarningが発生します。
対処法
本警告の対処法は以下の2点がありますがそれぞれ長所短所があるため、そのメリット・デメリットを皆様の環境や開発している目的に合わせて判断することになります。その判断を助けるためにも以下の2つの方法をご覧ください。
1. dtypeオプションで列の型を明示的に指定(軽量・精密)
この手法では警告が発生する問題のカラムをピンポイントで修正することが可能です。以下のコードで具体的な文法を見ていきましょう。
df = pd.read_csv("csvファイルパス文字列", dtype={カラム名: 型})
read_csv関数のオプション引数 dtypeに辞書形式でキーにカラム名、値に型を指定することでカラムごとの型指定が完了します。この手法の特徴は指定したカラムのみを改修を行う必要があるため、同警告が発生した場合にはそのカラムごとにピンポイントを修正を行います。長所として挙げられるのが後述の別手法と比較して、実行時間やメモリ消費量の増加を最小限に抑えることができます。しかし、短所として挙げられることはオプション引数dtypeで個別の記述が必要のため、大量に指定する場合は記述が長くなります。そのため、コードの可読性が退化するでしょう。また、プログラム改修のたびに別のカラムで同警告が発生する場合はその都度の修正が必要です。そのため、メンテナンス性が減少する代償もあります。以上のことから、メモリの少ない環境や改修の予定が少ない場合にお勧めの手法です。
2.low_memory=Falseを指定して一括読み込み(簡潔・高メモリ)
この手法は私が開発現場でよく使用する手法であり、個人的なおすすめでもあります。しかし、十分なメモリを確保できている環境でないと実行を推奨できない諸刃の剣でもあるため、対象csvファイルの大きさとメモリの大きさに問題ない状況で実施してください。具体的な方法は、オプション引数として low_memory=False を設定します。以下のコードで具体的な文法を見ていきましょう。
df = pd.read_csv("csvファイルパス文字列", low_memory=False)
以上のように指定することで一度で、csvファイルの全体を読み込むため正確な型推定が可能です。また、記述方法が簡潔なため複数回の改修に耐えうるメンテナンス性と一つの引数でデータフレーム全体に効果を及ぼすため、可読性に優れます。反面、メモリ使用量の増加と実行時間の増加の代償があるため、注意が必要です。
まとめ
今回は、大規模 CSV 読み込み時に頻発する DtypeWarning の原因と対処法を紹介しました。実務では、ログが警告文で埋もれてしまうという理由から対処を求められることもあります。座学だけでは「どの方法をどの場面で使うべきか」までは分かりにくいため、この記事が判断の助けになれば幸いです。