組み込み開発のためのPython · レッスン 125 / 238

Pandas Tutorial:表データを扱う

PandasのSeriesとDataFrameでラベル付きの表データを整理します。列の型、欠損、重複、時刻、単位を確認し、読み込み後にデータの前提を検証します。

PandasのSeriesとDataFrameでラベル付きの表データを整理します。列の型、欠損、重複、時刻、単位を確認し、読み込み後にデータの前提を検証します。 仕組みだけでなく、検証方法と運用上の注意も具体例で確認します。

Pandasが解決する課題

Pandasは行と列にラベルを持つデータを読み込み、選択、変換、集計するPythonライブラリーです。測定ログ、CSVの試験結果、表計算ソフトから出力した一覧などを扱うときに役立ちます。DataFrameは二次元の表、Seriesはラベル付きの一列を表し、列ごとに整数、文字列、日時など異なる型を持てます。インストールは仮想環境へ行い、実行時のPython環境が一致していることを確認しましょう。表を読み込めたことだけでデータが正しいとは限りません。列の意味、単位、欠損の表現、重複の扱いを処理の前に決めます。

SeriesとDataFrameの構造

Seriesは値とインデックスを持つ一次元データです。DataFrameは複数のSeriesを列として持ち、各行を識別するインデックスがあります。インデックスは表示上の行番号に見えても、データの同一性を保証する一意IDとは限りません。複数の表を結合するとき、行番号が同じという理由だけで同じ観測だと判断しないでください。columns、index、shape、dtypesを確認し、行数と列名を記録します。列名に空白や表記揺れがある場合、読み込み後に明示的に整理します。最初に構造を確かめることで、後続の選択や集計に隠れた前提を作らずに済みます。

CSVを読み込む前に確認する

read_csvはCSVをDataFrameへ読み込む基本関数です。ファイルの文字コード、区切り文字、ヘッダー、引用符、欠損値の表現を確認し、読み込み引数で必要な条件を指定します。列の値が数値に見えても、先頭のゼロが識別子の一部なら文字列として読む必要があります。日時列も、曖昧な形式やタイムゾーンを確認せずに自動変換すると誤った時刻になることがあります。大きなファイルでは必要な列や行だけを読み、メモリー使用量を抑えます。読み込み後はheadだけに頼らず、行数、末尾、型、欠損数を併せて確認してください。

列の型と変換を検査する

Pandasの列型は演算や欠損の表現方法を左右します。整数として期待する列が文字列になっていないか、数値の小数部が意図せず切り捨てられていないか確認します。to_numericやastypeで型を変換するときは、変換できない値をどう扱うか明示し、errorsを無条件にcoerceへ設定して不正値を欠損へ変換する場合は、その件数と理由を記録しましょう。カテゴリ値の表記揺れや余分な空白は集計結果を分割します。変換前後のユニーク値、最小・最大、件数を比較し、値の意味を変えていないか検証します。型が期待通りであることを後続処理の前提にします。

ラベルと位置で値を選ぶ

locは行・列のラベルで選択し、ilocは整数位置で選択します。列名で選択する方法は、列の順番が変わっても意味を保ちやすい一方、列名の変更には影響を受けます。単一列の指定がSeriesを返すか、列名をリストで渡した指定がDataFrameを返すかも確認してください。複数条件で行を絞るときは、各条件を括弧で囲み、ビット演算子を使います。条件に一致する行がゼロ件でも処理が安全に続くか確かめましょう。選択後にはshapeと対象キーを確認し、意図しない列や行が含まれていないことをテストします。

欠損値を見つけて扱う

欠損値は空欄、特殊文字、NaNなど複数の形で入力されることがあります。isnaで列ごとの件数や割合を調べ、欠損が入力漏れ、測定不能、対象外のどれを意味するか確認します。dropnaで行を削除する、fillnaで値を補う、欠損のまま別扱いにするなどの選択には、それぞれ分析への影響があります。平均値で補う方法は分布や相関を変え、ゼロ補完はゼロが実測値であるかのような意味を与える場合があります。欠損処理の対象列、条件、処理前後の件数を記録し、意図しない行の消失を検出してください。

条件抽出とデータの絞り込み

比較演算子やisin、betweenなどで条件に一致する行を抽出できます。文字列条件では大文字小文字、空白、表記揺れを確認し、日時条件では境界時刻とタイムゾーンを明確にします。抽出処理を連ねるときは、各段階の行数と対象範囲を記録し、前の条件が後の結果を意図せず除いていないか確認しましょう。複雑な条件を一行に詰め込むより、中間の条件へ分けて名前を付ける方が検査しやすくなります。抽出の再現性のため、利用した条件値をコードや設定として保持し、画面操作だけに依存しない手順を作ってください。

groupbyで集計する

groupbyはカテゴリやキーごとに行を分け、平均、合計、件数などを計算します。集計対象の列、欠損キーの扱い、同じIDが複数行ある意味を確認してください。センサーごとの平均を出す場合、サンプル数が異なるグループの平均をさらに単純平均すると、全測定の平均とは異なる値になることがあります。countとsizeも欠損値の数え方が異なるため、必要な定義を選びます。集計前後の行数、グループ数、各グループの件数を確認し、空のグループや極端に小さいグループを見落とさないようにします。必要なら複数の統計量を列名付きで出力します。

日時データと時系列

日時列を扱うときはto_datetimeで解析し、形式、タイムゾーン、無効な日時をどう扱うか決めます。UTCと現地時間を混在させると、日付境界や集計区間がずれる可能性があります。時刻順に並べ、重複タイムスタンプ、欠落期間、異なるサンプリング間隔を調べます。resampleやrollingを使う前に、インデックスが日時型で適切に整列されているか確認してください。未来のデータが学習や検証へ混ざると時系列評価の漏えいになります。時間の範囲を分割するときは、実際の運用で未来を予測する条件と同じ順序を保ちます。

mergeとjoinで表を結合する

複数のDataFrameを結合する前に、結合キーが何を識別するか、各表で一意かを調べます。キーが片側で重複していると、結合結果の行数が増え、測定件数や合計を誤らせることがあります。mergeのhowを選び、内部結合で片側だけにある行を捨ててよいか判断してください。validateで一対一や多対一などの期待関係を指定でき、意図しない多対多結合を検出する助けになります。結合前後の件数、未一致キー、重複を数え、結果から代表例を確認します。列名の衝突にはsuffixを使い、どの表に由来する値か明確にします。

結果を保存し再現する

to_csvやto_parquetなどで処理結果を保存できます。CSVは広く使えますが型や日時情報が失われやすいため、読み戻すときの区切り、文字コード、欠損値表記を決めてください。機密情報や個人情報を含む元データを、公開場所や共有フォルダーへ不用意に保存しないようにします。ファイルの上書き前には出力先と対象範囲を確認し、必要なら一時ファイルへ書いて検証後に置き換えます。処理の入力条件、ライブラリーの版、出力件数を記録すれば、後から違いを調査しやすくなります。保存後に再読込し、件数、列、型、代表値が保たれているか試験します。

練習課題:測定表を点検する

チャンネル名、測定時刻、電圧の列を含む小さなCSVを用意し、読み込みから結果保存までを再現可能なスクリプトにします。まず列名、型、件数、欠損を報告し、不正な電圧値と重複した測定IDを検出してください。次にチャンネルごとの中央値と有効件数を計算し、別の機器情報表とキーの一意性を確認してから結合します。最後に結果を保存して読み戻し、行数と単位が正しいことを検証します。欠損を除いた理由や除外件数、時刻の扱いを説明できるようにし、異常な入力を無言で破棄しないようエラーを明示してください。

コード例

手元のPython環境に貼り付ける前に、使用しているPythonの版と対象ライブラリの対応を確認してください。

import pandas as pd

measurements = pd.DataFrame({"channel": ["A0", "A1"], "value_mv": [3290, 3310]})
print(measurements.dtypes)
print(measurements.groupby("channel")["value_mv"].mean())

手を動かす課題

小さなCSVを読み込み、列の型と欠損数を確認してからチャンネル別の平均を計算してください。

参考資料

「Pythonのデータ分析ライブラリー」の章一覧へ