Pythonデータ分析 #1 pandas入門 — ノートブックとDataFrameという作業台
毎月同じ Excel ファイルを開いて、同じフィルタをかけ、同じピボットテーブルを作っているなら、その作業はコードに置き換えられます。このシリーズは、Excel や SQL でデータを触ったことのある方が pandas で同じ仕事をコードで処理する方法 を全7回で身につける過程です。Python の文法は モダンPython基礎 レベルで十分です。
- #1 pandas入門 — ノートブックとDataFrameという作業台 ← 今回
- #2 データの読み込みと探索
- #3 選択とフィルタ
- #4 変形と欠損値
- #5 グループ・集計・結合
- #6 可視化
- #7 polars体験とまとめ
Excelでやっていたことをコードに移すと何が良くなるのか #
Excel は優れた道具です。しかし、分析が大きくなると 3 つの場面で限界にぶつかります。この 3 つがシリーズ全体を貫く動機です。
- 再現が難しい。クリックで作った結果は過程が残らないので、1か月後に「この数字はどうやって出したのか」という質問に答えにくくなります。コードは過程そのものが記録なので、再実行すれば同じ結果が出ます。
- 大きなデータを開けない。Excel シートの上限は 1,048,576 行で、そこに届く前にスクロールや数式の再計算が重くなります。pandas はメモリが許す限り、数百万行でも同じコードで扱えます。
- 繰り返しが手作業になる。100 個のファイルに同じ整理をするなら、Excel では 100 回開くことになります。コードならループ 1 つで終わります。
環境準備: uvでpandasとJupyterをインストール #
今回は作業環境を作り、pandas の 2 つの中核構造である Series と DataFrame を手を動かして作ってみます。環境は uv ひとつで作ります。プロジェクトを初期化して pandas と JupyterLab を追加し、ノートブックサーバーを起動します。
uv init data-analysis --python 3.14
cd data-analysis
uv add pandas jupyterlab
uv run jupyter lab
# ブラウザが開いたら、左のランチャーから Python 3 ノートブックを新規作成してくださいノートブックという作業スタイル #
.py スクリプトは上から下まで一気に実行されますが、ノートブックはコードを セル という小さな枠に分けて書き、セルを 1 つ実行するとその結果がすぐ下に表示されます。変数はセルが終わっても生きているので、次のセルで続けて使えます。データ分析は「読み込んで、眺めて、少し変えてみて、結果を確認して」の繰り返しなので、変更したセルだけを再実行して結果を目で確かめられるノートブックがこの流れによく合います。このシリーズのコードはすべてノートブックのセル単位で書いていきます。
SeriesとDataFrame #
pandas の構造は 2 つだけ知っていれば十分です。
- Series: 値が一列に並んだ 1 次元の構造です。Excel の列 1 本に相当します。
- DataFrame: Series が横に並んだ 2 次元の表です。Excel のシート 1 枚に相当します。
たとえ話として安全なのはここまでで、違いが 1 つあります。pandas のすべての行には インデックス という名札が付きます。Excel の行番号はただの位置ですが、pandas のインデックスはデータの一部なので、並べ替えてもフィルタしても各行に付いて回り、日付や ID をインデックスにすれば位置ではなく名前で行を探せます。今は「行ごとに名札がある」ということだけ覚えておけば十分です。
最初のDataFrameを作る #
いちばん簡単な材料である dict から作ってみます。キーが列名、値のリストが列の中身になります。
import pandas as pd
df = pd.DataFrame({
"メニュー": ["アメリカーノ", "カフェラテ", "クロワッサン", "サンドイッチ"],
"価格": [4500, 5000, 3800, 6500],
"販売数": [120, 95, 40, 25],
"分類": ["ドリンク", "ドリンク", "ベーカリー", "フード"],
})
df メニュー 価格 販売数 分類
0 アメリカーノ 4500 120 ドリンク
1 カフェラテ 5000 95 ドリンク
2 クロワッサン 3800 40 ベーカリー
3 サンドイッチ 6500 25 フードセルの最後の行に変数名だけを書くと、ノートブックが表としてレンダリングしてくれます。print() は要りません。いちばん左の 0〜3 が、先ほど説明したインデックスです。指定しなければ 0 から始まる番号が自動で付きます。
列アクセスとdtypes #
列を 1 本取り出すと Series が返ります。
df["価格"]
# 0 4500
# 1 5000
# 2 3800
# 3 6500
# Name: 価格, dtype: int64Series 同士は Excel の数式のように丸ごと演算できます。行ごとに数式をドラッグで埋める必要はなく、新しい列を 1 行で作れます。
df["売上"] = df["価格"] * df["販売数"]
df表の右側に、行ごとに価格 × 販売数を計算した売上列が付きます。各列の型は dtypes で確認します。
df.dtypes
# メニュー object
# 価格 int64
# 販売数 int64
# 分類 object
# 売上 int64数値の列は int64、文字列の列は object になりました。実際の分析では、数値が入っているはずの列が object として読み込まれることが頻繁に起きますが、そのとき最初に見るのがこの dtypes です。
データを見る最初の3アクション: head, info, describe #
初めて見るデータを受け取ったとき、反射的に実行する 3 つがあります。このうち describe() の出力だけ少し見ておきます。
df.head() # 先頭5行のプレビュー
df.info() # 行数、列ごとの型、欠損値の数
df.describe() # 数値列の平均、最小/最大などの要約統計 価格 販売数 売上
count 4.00 4.00 4.00
mean 4950.00 70.00 332375.00
min 3800.00 25.00 152000.00
max 6500.00 120.00 540000.004 行の表では物足りなく見えますが、行が 10 万件あるとき、この 1 行がデータの全体像を見せてくれます。3 アクションの出力をきちんと読む方法は、#2 データの読み込みと探索 で実際の CSV ファイルを使って詳しく扱います。
ノートブックの落とし穴: セルの実行順序 #
ノートブックには 1 つ落とし穴があります。セルは書かれた順ではなく、実行した順に反映されます。上のセルを直して再実行しても、下のセルたちは古い結果を基に作った変数を持ったままですし、セルを削除してもそのセルが作った変数はメモリに残っています。このずれが積もると、「ノートブック上では動いたのに、開き直すと動かない」状態になります。予防法は単純です。セルはできるだけ上から下に読める順序に整理し、区切りのたびに Restart Kernel and Run All Cells で最初から最後まで一気に回してみます。最初から最後まできれいに通るノートブックだけが、再現可能な分析です。最初の動機だった「再現可能」は、ノートブックを使えば自動的に手に入るものではなく、この習慣から生まれます。
まとめ #
今回作った土台です。
- Excel と比べたコード分析の利点: 再現可能、大きなデータ、繰り返しの自動化
uv add pandas jupyterlab+uv run jupyter labで環境構築- Series は列 1 本、DataFrame は表 1 枚、インデックスは行の名札
- dict からの DataFrame 作成、列アクセス、列演算、
dtypesの確認 - 最初の 3 アクション head / info / describe と、セル実行順序の落とし穴
次回(#2 データの読み込みと探索)では、自分で作った表ではなく、実際の CSV・Excel ファイルを読み込む方法 を扱います。read_csv の主要オプション、エンコーディング問題、そして head / info / describe で見知らぬデータの輪郭をつかむ手順まで整理します。