第1章:はじめに ~pandasって何?なぜ使うの?~
Pythonでデータ分析や統計処理を始めようとしたとき、最初にぶつかる壁は「表形式のデータをどう扱えばいいのか?」ということです。
たとえば、CSVファイルやエクセルのような行と列のデータを読み込み、分析に使いたいと思ったとき、素のPythonだけでは不便です。
そこで登場するのが、pandasというライブラリです。
✔ pandasとは?
- 表形式のデータ(行と列からなるデータ)をPythonで扱えるようにするツール
- データの読み込み・加工・並び替え・集計・保存が簡単にできる
- 機械学習、統計分析、業務データの整形など、あらゆるデータ処理の基盤
pandasを使いこなせる=Pythonでデータを自由自在に操れるようになるということ。
✔ pandasの得意なこと
| できること | 説明 |
|---|---|
| CSVやExcelファイルの読み書き | データの読み込み&保存 |
| データの抽出・加工 | 欲しい列だけ、条件に合う行だけなど |
| 並び替え・集計 | 大きい順に並べたり、グループごとの平均を計算 |
| 欠損値の処理 | データの空欄(NaN)に対応 |
| データの可視化 | グラフ化の準備が簡単にできる |
✔ pandasを使うとどう変わる?
✅ Excelで苦労していた操作も、1行のコードで一瞬!
df[df["点数"] >= 80].sort_values("点数", ascending=False)➡ 「80点以上の人だけを、点数の高い順に表示する」
このように、複雑な操作がシンプルに書けるのがpandasの魅力です。
✔ pandasは誰におすすめ?
- 統計・機械学習を始めたい人
- Pythonでデータ処理をしたい人
- Excelに限界を感じている人
- 研究データをプログラムで扱いたい人(薬学・化学・社会科学など)
第2章:pandasの基本構造(SeriesとDataFrame)
pandasを使いこなすには、まず「Series(シリーズ)」と「DataFrame(データフレーム)」という2つのデータ構造を理解することがとても大切です。
この章では、それぞれの特徴と使い方をわかりやすく解説します。
✔ Seriesとは?
Seriesは、「1列だけのデータ」を扱うための構造です。
Excelで言えば、ある1列だけを抜き出したようなイメージです。
import pandas as pd
s = pd.Series([100, 200, 300])
print(s)出力例:
0 100
1 200
2 300
dtype: int64- 左の数字(0, 1, 2)は「インデックス」と呼ばれるラベル
- 右の数字(100, 200, 300)が実際のデータです
- インデックスをカスタマイズすることもできます
s = pd.Series([100, 200, 300], index=["A", "B", "C"])
print(s)📝 問題
次のコードの出力は何になるでしょうか?
import pandas as pd
s = pd.Series([10, 20, 30], index=["a", "b", "c"])
print(s["b"])💡 解説
Seriesはインデックス(この場合 “a”, “b”, “c”)をキーとして値を取り出せる構造です。
✅ 回答
20✔ DataFrameとは?
DataFrameは、複数のSeriesをまとめた表形式のデータです。
行と列からなる構造で、Excelに近いイメージです。
df = pd.DataFrame({
"名前": ["太郎", "花子", "次郎"],
"年齢": [20, 21, 19]
})
print(df)出力例:
名前 年齢
0 太郎 20
1 花子 21
2 次郎 19- 行:インデックス(0, 1, 2)
- 列:「名前」「年齢」などのラベル付きデータ
- 各列は内部的にはSeriesになっています!
✔ SeriesとDataFrameの違い
| 比較項目 | Series | DataFrame |
|---|---|---|
| 構造 | 1次元 | 2次元(行と列) |
| 表現できる情報 | 単一列のみ | 複数列(Excelの表のよう) |
| 用途 | 単純な配列や1項目の操作に使う | 本格的な表形式データを扱う |
✔ 実例:データの一部をSeriesとして取り出す
# DataFrameの「年齢」列をSeriesとして抽出
ages = df["年齢"]
print(type(ages)) # → <class 'pandas.core.series.Series'>※ #より右はコメントアウトされており実行結果に影響を与えない。可読性を上げる。
pandasでは、DataFrameから特定の列を取り出すと、Seriesとして返されます。
この2つを押さえておけば、以降のpandas操作の土台はバッチリです!
📝 問題
次のDataFrameから「2行目の ‘名前’ 列の値」を取り出すには?
df = pd.DataFrame({
"名前": ["太郎", "花子", "次郎"],
"点数": [80, 90, 70]
})💡 解説
pandasでは .loc[行ラベル, 列ラベル] または .iloc[行番号, 列番号] で値を取り出せます。2行目は index=1。
✅ 回答
df.loc[1, "名前"]
# または
df.iloc[1, 0]第3章:データの読み込みと作成(read_csvと手作りデータ)
pandasの大きな魅力のひとつは、CSVファイルなどの外部データを簡単に読み込めることです。
また、手作業でデータを作って試すこともできます。
この章では、実際のデータを用いた2つの方法を紹介します。
✔ CSVファイルを読み込む(read_csv)
まずはCSVファイルからのデータ読み込み。以下のように簡単に読み込めます:
import pandas as pd
df = pd.read_csv("sample.csv")read_csvはCSVファイル読み込み専用の関数- 引数にはファイルパス(Google Colabではアップロード必要)
▼ 先頭だけ表示して確認しよう
df.head() # 最初の5行df.tail() # 最後の5行✔ ColabでCSVファイルを使う方法(初心者向け)
Google Colabを使っている人は、次のコードでファイルアップロードできます:
from google.colab import files
uploaded = files.upload()アップロード後、ファイル名をそのまま read_csv に渡せばOKです。
✔ 手作りのデータで練習したいとき
data = {
"名前": ["太郎", "花子", "次郎", "さくら", "健"],
"年齢": [20, 21, 19, 22, None],
"点数": [88, 92, 95, 70, 83]
}
df = pd.DataFrame(data)
print(df)このようにして簡単に練習用データフレームを作ることができます。
✔ 読み込んだデータの情報をざっと確認するには?
以下のメソッドで「データの構造」を把握できます👇
df.shape # 行数と列数をタプルで返す
df.columns # 列名一覧を取得
df.dtypes # 各列のデータ型を確認✔ 使える基本チェックメソッド
| メソッド | 説明 |
|---|---|
df.info() | 各列のデータ型・欠損値の有無など、構造情報を表示 |
df.describe() | 数値列の要約統計量(平均・標準偏差など)を表示 |
df.info()
df.describe()「どんなデータなのか」「欠損値があるか」「行数は?」といった初期確認は、info()とdescribe()で一気にできます。
pandasでは、「まず全体を把握してから加工に入る」のがコツです!
次の章では、列や行の選び方、条件によるデータ抽出方法(フィルタリング)について詳しく見ていきます。
第4章:データの選択と抽出(列・行・条件フィルタ)
pandasでは、欲しいデータだけを取り出すための操作がとても柔軟にできます。
この章では、列・行・条件によるフィルタの方法を、具体例とともにじっくり解説します。
✔ 列を取り出す
単一列の取り出し(Seriesとして取得)
df["名前"]複数列の取り出し(DataFrameとして取得)
df[["名前", "点数"]]✅ ポイント:複数列のときは リスト
[]の中にさらに[]を使う
✔ 行を取り出す(インデックスによる抽出)
.iloc[]:位置番号で指定(0番目〜)
df.iloc[0] # 1行目(0番目)のデータ
df.iloc[1:3] # 2〜3行目(スライス).loc[]:インデックスラベルで指定(通常は数字)
df.loc[0] # 0番というラベルの行📝 問題
df.iloc[1, 1] と df.loc[1, "点数"] の違いは?
💡 解説
.iloc[]→ 行番号・列番号を指定(整数).loc[]→ 行ラベル・列ラベルを指定(実際のインデックスや列名)
✅ 回答
どちらも「index=1」の行の「点数」列を指定しているので、結果は同じです。違いは「指定の方法」です。
✔ 条件でフィルタリング(行の絞り込み)
例:点数が80以上の人だけ表示
df[df["点数"] >= 80]条件に複数列を使う(AND)
df[(df["点数"] >= 80) & (df["年齢"] >= 20)]条件に複数列を使う(OR)
df[(df["点数"] >= 90) | (df["年齢"] < 20)]✅ ポイント:
&(かつ)、|(または)を使うときは 各条件を()で囲むこと!
✔ 特定の値を含む行を抽出(isin)
df[df["名前"].isin(["花子", "健"])]これは、「名前が花子または健である人」を取り出す操作です。
✔ 特定の列に値を代入(列の追加)
df["評価"] = ["A", "A", "S", "B", "B"]このようにして、新しい列を自由に追加することもできます。
次章では、欠損値の扱い方(dropna・fillna)と補完方法(平均・中央値での埋め)について丁寧に説明します!
📝 問題
点数が80点以上なら「合格」、そうでなければ「不合格」と記載した新しい列「合否」を追加してください。
💡 解説
条件による列追加には np.where() を使うのが便利です。
✅ 回答
import numpy as np
df["合否"] = np.where(df["点数"] >= 80, "合格", "不合格")第5章:欠損値処理(dropna・fillna・平均補完)
現実のデータには「抜け」や「空欄(NaN)」が含まれることがよくあります。
pandasでは、こうした欠損値(NaN)を柔軟に処理できます。
この章では、基本操作である dropna()・fillna() に加えて、平均値や中央値を使った補完方法まで丁寧に紹介します。
✔ 欠損値(NaN)とは?
- NaN(Not a Number)は「値が存在しない・不明であること」を表す特殊な値です。
- pandasでデータを読み込んだとき、空欄は自動的に
NaNとして認識されます。
✔ 欠損値を含む行を削除する:dropna()
df.dropna()NaNを含む行を丸ごと削除します- 元のDataFrameを変更しないので、必要に応じて
inplace=Trueを指定
df.dropna(inplace=True)✔ 欠損値を埋める:fillna()
df.fillna(0)NaNを 0で埋める- 他にも
"不明"や"未設定"のような文字列で埋めることもできます
df.fillna("未設定")✔ 平均値で欠損を補う
mean_age = df["年齢"].mean()
df["年齢"] = df["年齢"].fillna(mean_age)- 欠損値のある列に
mean()(平均値)を計算して補完 - 実務ではよく使われる方法のひとつです
✔ 中央値で補う(外れ値が多いときにおすすめ)
median_age = df["年齢"].median()
df["年齢"] = df["年齢"].fillna(median_age)median()は「中央値」を返します- 平均よりも外れ値の影響を受けにくい
✔ 欠損値の場所を確認する:isna() と any()
df.isna().any()| 操作 | 内容 |
|---|---|
isna() | 各セルがNaNかどうか(True/False)を返す |
any() | 列ごとに1つでもNaNがあるか |
# NaNを含む行だけを表示
df[df.isna().any(axis=1)]📌 補足:どの方法を使えばいいの?
| 状況 | 処理方法の例 |
|---|---|
| データが少なく、欠損行がわずか | dropna()で削除 |
| 欠損が多く、特定の値で補いたい | fillna(0)や fillna("未設定") |
| 数値列で統計的に埋めたい | 平均(mean())や中央値(median())で補完 |
次は、並べ替え(ソート)やグループごとの平均・合計などの集計処理について解説していきます!
第6章:並べ替えと集計(sort_values・groupby)
データ分析では、数値の大小で並べ替えたり、グループごとに平均・合計を出したりといった操作がよく行われます。
この章では、pandasの中でも特によく使われる2つのメソッド、
sort_values()(並べ替え)groupby()(グループ集計)
を中心に解説します。
✔ 並べ替え(sort_values)
例:点数が高い順に並べる
df.sort_values("点数", ascending=False)ascending=False:降順(大きい順)に並べ替える- デフォルトは
ascending=True(小さい順)
複数の列で並べ替え
たとえば、点数が同じ人がいるとき、年齢で再度ソートしたい場合:
df.sort_values(by=["点数", "年齢"], ascending=[False, True])✅ byにリストで列名、ascendingにもリストで順序を指定できる
📝 問題
点数が高い順に並べ替えて表示するには?
💡 解説
sort_values(by=列名, ascending=False) を使います。
✅ 回答
df.sort_values(by="点数", ascending=False)✔ グループごとの集計(groupby)
例:名前ごとに点数の平均を計算
df.groupby("名前")["点数"].mean()例:複数の集計を同時に(mean, max)
df.groupby("名前")["点数"].agg(["mean", "max"])agg()を使えば、複数の統計量を一度に出せる"sum","min","count"などもOK
例:複数の列でグループ化して集計
df.groupby(["名前", "年齢"])["点数"].mean()- 2つの列(名前と年齢)を組み合わせた単位で集計
📝 問題
次のようなDataFrameから、性別ごとの点数平均を求めるには?
df = pd.DataFrame({
"名前": ["太郎", "花子", "次郎"],
"性別": ["男", "女", "男"],
"点数": [88, 92, 95]
})💡 解説
groupby() と mean() を組み合わせます。
✅ 回答
df.groupby("性別")["点数"].mean()✔ 集計後の並べ替えもできる
df.groupby("名前")["点数"].mean().sort_values(ascending=False)➡ 「平均点が高い順に名前を並べる」ことができる
✔ groupbyの結果をDataFrame化(reset_index)
groupby後に得られる結果は「Series型」や「MultiIndex DataFrame」になることがあります。
そのまま使いづらいときは、reset_index()で通常のDataFrameに戻せます:
df.groupby("名前")["点数"].mean().reset_index()これらの操作を組み合わせれば、「データの傾向を探る」「重要な指標を一覧化する」ことがとても簡単になります!
次の章では、さらに役立つpandasの便利機能──value_counts()・unique()・条件マッチング(isin())について紹介します!
第7章:よく使う便利メソッド(value_counts・unique・isin)
pandasには、よく使う操作を一発でできる便利メソッドがたくさん用意されています。
この章では、カテゴリデータの分析や条件フィルタに役立つ3つのメソッドを紹介します。
✔ ① value_counts():値の出現回数をカウント
「各値が何回出てきたか」を集計できます。
df["名前"].value_counts()出力例:
花子 1
太郎 1
次郎 1
さくら 1
健 1
Name: 名前, dtype: int64✅ 回数順(多い順)で自動的にソートされるのが便利!
NaNも含めたいときは?
df["年齢"].value_counts(dropna=False)✔ ② unique():ユニークな値(重複なし)を取得
df["名前"].unique()➡ 結果は NumPyの配列(ndarray) で返されます:
array(['太郎', '花子', '次郎', 'さくら', '健'], dtype=object)- 重複なしで取り出すときに便利
- データの「種類」を把握したいときに使います
✔ ③ isin():特定の値を含むかチェック
df[df["名前"].isin(["花子", "健"])]これは、「名前が花子または健の行だけを抽出」する条件フィルタです。
内部的にはこんな感じ:
df["名前"].isin(["花子", "健"])
# → True, False, False, False, True ...
✔ 応用:複数条件と組み合わせて使う
df[(df["名前"].isin(["花子", "太郎"])) & (df["点数"] >= 80)]isin()で対象を絞りつつ、数値条件ともANDで組み合わせることで、柔軟な絞り込みが可能になります。
これらの便利メソッドを知っておくだけで、コードが大幅に短く・読みやすくなります!
次章では、分析の結果をグラフで可視化する方法(matplotlib)を紹介していきます。
📝 問題
次の条件に当てはまる行だけを抽出してください:
「点数が80点以上」「名前が ‘さくら’ ではない」
💡 解説
条件は &(かつ)や |(または)で複数指定できます。文字列の否定には != を使います。
✅ 回答
df[(df["点数"] >= 80) & (df["名前"] != "さくら")]第8章:簡単な可視化(matplotlibで棒グラフ)
データの特徴をつかむには、数字をグラフで視覚化することがとても効果的です。
pandasは、グラフ描画ライブラリ「matplotlib」と連携して、一行でグラフを描くことができます。
この章では、棒グラフやヒストグラムを中心に、最も簡単な可視化方法を紹介します。
✔ matplotlibをインポート
import matplotlib.pyplot as pltGoogle Colab では最初から使えるので、特別な準備は不要です。
✔ 棒グラフ:カテゴリと数値の対応を視覚化
df.plot(kind="bar", x="名前", y="点数")
plt.title("名前ごとの点数")
plt.xlabel("名前")
plt.ylabel("点数")
plt.show()df.plot()でそのままグラフ描画!kind="bar":棒グラフxとyに列名を指定するだけでOK
✔ 集計結果の棒グラフ
df.groupby("名前")["点数"].mean().plot(kind="bar")
plt.title("名前ごとの平均点")
plt.ylabel("平均点")
plt.show()➡ groupby() → mean() で平均値を出して、そのまま棒グラフに!
✔ ヒストグラム:点数の分布を見る
df["点数"].plot(kind="hist", bins=5, edgecolor="black")
plt.title("点数の分布")
plt.xlabel("点数")
plt.show()kind="hist":ヒストグラム(分布を見るグラフ)bins=5:区切りの数(棒の数)
✔ 折れ線グラフ(時間変化がある場合に便利)
df.sort_values("年齢").plot(x="年齢", y="点数", kind="line", marker="o")
plt.title("年齢と点数の関係")
plt.show()📌 ※ 本記事の例では時間軸はないので参考程度ですが、時間とともに変化するデータに使えます。
✔ グラフが表示されないときの対処法
Colabなど一部環境では、plt.show() を忘れるとグラフが出ません。
グラフを描くたびに plt.show() を入れる習慣をつけましょう!
これで「数字を読む」だけでなく、「見て感じる分析」もできるようになります!
次章では、加工したデータをCSVファイルに保存する方法を紹介します。
第9章:データの保存(to_csv)
データを加工・分析したあとは、その結果をファイルとして保存することが多いです。
pandasでは、たった1行でCSVファイルへの保存ができます。
この章では、to_csv() の使い方を中心に、保存時のオプションや注意点も解説します。
✔ 基本的な保存方法:to_csv()
df.to_csv("output.csv")output.csvというファイル名で保存- カレントディレクトリ(Colabでは左側のファイル一覧)に出力されます
✔ indexを除いて保存(よくある注意点)
df.to_csv("output.csv", index=False)- デフォルトでは「行番号(index)」も一緒に保存される
index=Falseを指定すると、不要な行番号を除けます
✔ エンコーディング(文字化け対策)
Windowsで開くと文字化けする場合、encoding="utf-8-sig" を使うと安全です:
df.to_csv("output.csv", index=False, encoding="utf-8-sig")✔ 保存先のパスを指定する(ローカル環境)
df.to_csv("C:/Users/username/Desktop/output.csv", index=False)✅ パスに日本語や全角文字が含まれていると、エラーになる場合があります。
✔ Colabでのダウンロードリンク表示(おまけ)
Colabで保存したCSVをPCにダウンロードするには、次のように書きます:
from google.colab import files
files.download("output.csv")これで、pandasで加工・分析したデータをCSVとして自由に保存・共有できるようになりました!
次がいよいよ最終章です。
ここまで学んだ内容を振り返りながら、練習課題と今後のステップアップについてまとめます。
第10章:まとめと練習課題
✅ pandasでできるようになったこと
この記事では、pandasの超入門〜実用レベルの基礎操作までを段階的に学びました。
ここで、できるようになったことを振り返りましょう。
| 内容 | 操作例 |
|---|---|
| データの読み込み | pd.read_csv() |
| 表の構造理解 | df.info(), df.describe() |
| 列や行の抽出 | df["列名"], df.iloc[行番号] |
| 条件での絞り込み | df[df["点数"] >= 80] |
| 欠損値処理 | dropna(), fillna() |
| 並べ替え | sort_values() |
| グループ集計 | groupby() |
| データの保存 | to_csv() |
| グラフの描画 | df.plot()(matplotlib) |
| よく使う便利機能 | value_counts(), unique(), isin() |
💪 実践で力をつける!練習課題
ここまでの内容をしっかり身につけるために、次の練習課題に挑戦してみましょう!
📘 練習データ
以下のようなCSVファイルを仮定してください(手作業で作ってもOK):
| 名前 | 年齢 | 点数 |
|---|---|---|
| 太郎 | 20 | 88 |
| 花子 | 21 | 92 |
| 次郎 | 19 | 95 |
| さくら | 22 | 70 |
| 健 | NaN | 83 |
📝 課題リスト
- 上記の表をDataFrameとして読み込む(または直接作成)
- 欠損している年齢を平均で補完
- 80点以上の人だけを抽出して表示
- 名前ごとの平均点を棒グラフで可視化
- 結果を
result.csvとして保存
回答例は一番下
📌 これからのステップ
pandasの基礎を習得したあなたは、次のような応用に進むことができます:
- 【pandas中級編①】mergeとconcatで複数の表をつなげる方法まとめ
- 【pandas中級編②】列の追加・削除・名前変更・順序変更まとめ
- 【pandas中級編③】pivot_tableの使い方をやさしく解説(Excel派必見!)
- 【pandas中級編④】groupbyの集計パターン大全(aggで複数指標)
- 【実践編】pandasで都道府県別・男女別売上を集計する
🧭 参考リンク・シリーズナビ
▶︎ 【前の記事】
【5分で理解】Pythonモジュール・ライブラリの使い方【pandas・numpy入門】
✅ 回答例(Pythonコード)
import pandas as pd
import matplotlib.pyplot as plt
# 1. DataFrameの作成
data = {
"名前": ["太郎", "花子", "次郎", "さくら", "健"],
"年齢": [20, 21, 19, 22, None],
"点数": [88, 92, 95, 70, 83]
}
df = pd.DataFrame(data)
# 2. 年齢の欠損値を平均で補完
mean_age = df["年齢"].mean()
df["年齢"] = df["年齢"].fillna(mean_age)
# 3. 80点以上の人だけを抽出
high_score_df = df[df["点数"] >= 80]
# 4. 名前ごとの平均点を棒グラフで可視化
avg_score = df.groupby("名前")["点数"].mean()
avg_score.plot(kind="bar", title="名前ごとの平均点", ylabel="平均点", xlabel="名前")
plt.show()
# 5. 結果をCSVファイルとして保存
df.to_csv("result.csv", index=False)

コメント