Pandas: 【初心者向け】Pandas入門:NumPyとの違い・DataFrame基礎・インストール方法

NumPyはPythonにおける数値計算の性能問題を解決しましたが、現実世界のデータは「純粋な数値配列」よりもはるかに複雑です。列名があり、型が混在し、欠損値があり、ファイル形式も多岐にわたります。Pandasはまさにこのために作られました。SQLに匹敵するデータ操作能力をPythonに与えつつ、コードは簡潔で直感的に保てるのです。本セクションではNumPyの限界から出発し、なぜPandasがデータ分析の「アーミーナイフ」と呼ばれるのかを明らかにしていきますね。

⚠️ 注意: 以下のコードを実行するには、ローカルのPython環境が必要です。

1. 学べること



2. NumPyからPandasへの進化

(1) 痛点:アリスの混合型ジレンマ

アリスは顧客データを扱う必要があるデータアナリストです。名前は文字列、年齢は整数、給与は浮動小数点数、入社日はdatetime値です。彼女はまずNumPyを試してみます。

▶ サンプル:NumPyが混合型データで苦戦する様子(難易度 ⭐)

TEXT 📖 参照専用
> **出力:** ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)してから進めてくださいね。実際の値はpandasのバージョンによって若干異なる場合があります。
PYTHON
import numpy as np

# 顧客データ:名前(str)、年齢(int)、給与(float)
names = np.array(['Alice', 'Bob', 'Charlie'])
ages = np.array([28, 34, 25])
salaries = np.array([75000.0, 92000.0, 68000.0])

# 問題1:型を混ぜるとobjectへアップキャストされてしまう
mixed = np.array(['Alice', 28, 75000.0])
print(mixed.dtype)  # object — 数値演算ができなくなる!

# 問題2:object配列では平均を計算できない
try:
    print(np.mean(mixed))  # エラーまたは意味のない結果
except TypeError:
    print("object配列では平均を計算できません")

# 問題3:欠損値には特別な処理が必要
ages_with_nan = np.array([28, 34, np.nan, 25])
print(np.mean(ages_with_nan))  # nan — np.nanmean()が必要
TEXT 📖 参照専用
> **出力:** ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)してから進めてくださいね。実際の値はpandasのバージョンによって若干異なる場合があります。

NumPyの核心的な限界は同次型(ホモジニアス)であることです。1つのndarrayには1つのデータ型しか格納できません。文字列と数値を同じ配列に入れると、NumPyはすべてをobject型にアップキャストしてしまい、ベクトル化された演算機能がすべて失われます。さらに、NumPyには「列名」という概念がなく、組み込みの欠損値システムもありません(np.nanに頼るしかなく、しかも浮動小数点型でしか使えません)。

(2) 解決策:ボブのPandas DataFrame

ボブは同じデータをPandas DataFrameで処理します。たった一発でスムーズに解決できますよ。

▶ サンプル:Pandasで混合型データを扱う(難易度 ⭐⭐)

TEXT 📖 参照専用
> **出力:** ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)してから進めてくださいね。実際の値はpandasのバージョンによって若干異なる場合があります。
PYTHON
import pandas as pd

# 1つのDataFrameで混合型を自然に扱える
df = pd.DataFrame({
    'name': ['Alice', 'Bob', 'Charlie'],
    'age': [28, 34, 25],
    'salary': [75000.0, 92000.0, 68000.0],
    'hire_date': pd.to_datetime(['2022-03-15', '2019-08-01', '2023-01-10'])
})

print(df.dtypes)
# name                 object
# age                   int64
# salary              float64
# hire_date    datetime64[ns]

print(df['salary'].mean())  # 78333.33 — 自然に動作する
print(df[df['age'] > 27])   # 条件でフィルタリング
TEXT 📖 参照専用
> **出力:** ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)してから進めてくださいね。実際の値はpandasのバージョンによって若干異なる場合があります。

各列は独自の型を保ち、統計演算は自動的に機能し、条件フィルタリングはSQLと同じくらい直感的です。これこそがPandasの魅力ですね。

(3) メリット:4つのコア機能

PandasはNumPyの上に4つの重要な機能を追加しています。

機能 NumPy Pandas
ラベル付きインデックス 整数位置でのアクセスのみ 列名/行ラベルでアクセス
混合型 配列ごとに1つの型 列ごとに独立した型
欠損値 np.nan(浮動小数点のみ) NaNNaTpd.NA(完全カバレッジ)
データIO np.loadtxtnp.savetxt CSV/Excel/JSON/SQL/Parquet/HDF5


3. Pandasのコア優位性の詳細

(1) ラベル付きインデックス:自己記述的なデータ

NumPyではarr[0]arr[1, 2]のようにデータにアクセスします。「0列目が名前で、2列目が給与だ」と覚えておかなければなりません。Pandasなら、データ自身が語ってくれます。

▶ サンプル:ラベル付きインデックスと位置インデックスの比較(難易度 ⭐)

TEXT 📖 参照専用
> **出力:** ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)してから進めてくださいね。実際の値はpandasのバージョンによって若干異なる場合があります。
PYTHON
import numpy as np
import pandas as pd

# NumPy:列の順序を覚えておく必要がある
arr = np.array([['Alice', 28, 75000.0],
                ['Bob', 34, 92000.0]])
# 2列目は何だっけ?ドキュメントを確認する必要がある
print(arr[0, 2])  # 75000.0 — でもこれは何を意味する?

# Pandas:列名が自己ドキュメント化されている
df = pd.DataFrame(arr, columns=['name', 'age', 'salary'])
df['age'] = df['age'].astype(int)
df['salary'] = df['salary'].astype(float)
print(df['salary'])  # 列名がすべてを物語っている
# 0    75000.0
# 1    92000.0
print(df.loc[0, 'name'])  # Alice — ラベルベースのアクセス
TEXT 📖 参照専用
> **出力:** ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)してから進めてくださいね。実際の値はpandasのバージョンによって若干異なる場合があります。

(2) 混合型:列ごとに独立したdtype

DataFrameの各列(Series)は独自のdtypeを持っています。Excelのスプレッドシートで各列が異なる書式を持てるのと同じですね。

機能 NumPy ndarray Pandas DataFrame
型の制約 配列全体で単一のdtype 列ごとに独立したdtype
文字列の列 配列全体がobjectに格下げされる 1つの列だけがobject/StringDtypeになる
数値の列 文字列と分離する必要がある 文字列の列と共存できる
演算 グローバルなベクトル化 列ごとの独立した演算

(3) 欠損値処理:ネイティブサポート

PandasはNaN(浮動小数点の欠損)、NaT(datetimeの欠損)、pd.NA(汎用欠損)を備えた完全な欠損値システムを提供します。一方、NumPyのnp.nanは浮動小数点型でしか動作しません。

▶ サンプル:欠損値処理の比較(難易度 ⭐)

TEXT 📖 参照専用
> **出力:** ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)してから進めてくださいね。実際の値はpandasのバージョンによって若干異なる場合があります。
PYTHON
import numpy as np
import pandas as pd

# NumPy:整数配列のnanは浮動小数点への変換を強制する
arr = np.array([1, 2, np.nan, 4])
print(arr.dtype)  # float64 — 整数が失われた!
print(np.mean(arr))  # nan — np.nanmean()が必要

# Pandas:列ごとに欠損値を処理する
s = pd.Series([1, 2, pd.NA, 4], dtype='Int64')  # nullable整数
print(s)  # <NA>付きで整数型を維持
print(s.mean())  # 2.333 — 欠損値を自動でスキップ
TEXT 📖 参照専用
> **出力:** ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)してから進めてくださいね。実際の値はpandasのバージョンによって若干異なる場合があります。

(4) 豊富なIOツール:ワンストップのデータハブ

▶ サンプル:Pandasでデータを読み書きする(難易度 ⭐)

TEXT 📖 参照専用
> **出力:** ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)してから進めてくださいね。実際の値はpandasのバージョンによって若干異なる場合があります。
PYTHON
import pandas as pd
from io import StringIO

# CSV文字列から読み込む
csv_data = """name,age,salary
Alice,28,75000
Bob,34,92000
Charlie,25,68000"""
df = pd.read_csv(StringIO(csv_data))
print(df)

# さまざまな形式に書き出す
# df.to_csv('output.csv', index=False)
# df.to_excel('output.xlsx', sheet_name='Employees')
# df.to_json('output.json', orient='records')
TEXT 📖 参照専用
> **出力:** ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)してから進めてくださいね。実際の値はpandasのバージョンによって若干異なる場合があります。


4. DataFrameとExcel/SQL:アナロジーで理解する

(1) 横並び比較

概念 Excel SQLテーブル Pandas DataFrame
データ構造 ワークシート(Sheet) テーブル DataFrame
行番号 行(Rows) Index(行ラベル)
列アルファベット(A、B、C) 列名 Columns(列名)
フィルタリング オートフィルター WHERE df[条件]
ソート 並べ替え ORDER BY df.sort_values()
グループ化 ピボットテーブル GROUP BY df.groupby()
結合 VLOOKUP JOIN pd.merge()
列の追加 数式列 SELECT式 df['new'] = 式
重複排除 重複の削除 DISTINCT df.drop_duplicates()

(2) 主な違い

3つとも似た概念を共有していますが、DataFrameにはExcelやSQLにない機能があります。



5. Pandasエコシステムの全体像

(1) データサイエンスにおけるPandasの位置づけ

100%
mindmap
  root((Pandasエコシステム))
    データ入力
      CSV Excel JSON
      SQLデータベース
      Parquet HDF5
      Webスクレイピング
    データ処理
      クリーニング
      変換
      結合
      リシェイプ
    データ分析
      Groupby集計
      ピボットテーブル
      時系列
      統計サマリー
    データ出力
      可視化 Matplotlib
      機械学習 scikit-learn
      レポート HTML Excel
    基盤
      NumPy ndarray
TEXT 📖 参照専用
> **出力:** ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)してから進めてくださいね。実際の値はpandasのバージョンによって若干異なる場合があります。

(2) スタックにおけるPandasの役割

PandasはPythonデータサイエンススタックの中核に位置し、低レイヤーの計算と高レイヤーの分析を橋渡ししています。

レイヤー ツール 役割
低レイヤー計算 NumPy 高性能な数値計算エンジン
データ処理 Pandas 表形式データの読み込み/クリーニング/変換/分析
可視化 Matplotlib/Seaborn チャートやプロット
機械学習 scikit-learn モデルの訓練と予測
ディープラーニング PyTorch/TensorFlow ニューラルネットワーク
💡 ヒント: 内部的には、PandasのDataFrameはNumPyのndarrayによって支えられています。数値列に対して演算を行うとき、実際にはNumPyのベクトル化関数を呼び出しているのです。Pandasとは「NumPyを表形式データで使えるようにする」レイヤーなのですね。



6. 完全な例:NumPyとPandasの全ワークフロー比較

▶ サンプル:学生の成績分析 — 全ワークフロー(難易度 ⭐⭐⭐)

TEXT 📖 参照専用
> **出力:** ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)してから進めてくださいね。実際の値はpandasのバージョンによって若干異なる場合があります。
PYTHON
import numpy as np
import pandas as pd

# ============================================
# 包括的な比較:NumPy vs Pandas
# 学生の成績分析ワークフロー
# ============================================

# --- 生データ ---
students = ['Alice', 'Bob', 'Charlie', 'Carol', 'David']
math = [85, 92, 78, 95, 88]
english = [90, 85, 82, 88, 91]
science = [88, 90, 75, 93, 86]

# --- NumPyアプローチ ---
scores_np = np.array([math, english, science])  # shape: (3, 5)
# どの行がどの科目?覚えておく必要がある:0行目=math、1行目=english、2行目=science
# どの列がどの学生?順序を覚えておく必要がある
avg_per_student = scores_np.mean(axis=0)
print("NumPy - 学生ごとの平均(位置指定):")
for i, avg in enumerate(avg_per_student):
    print(f"  学生 {i}: {avg:.1f}")  # 学生0って誰?

# --- Pandasアプローチ ---
df = pd.DataFrame({
    'student': students,
    'math': math,
    'english': english,
    'science': science
})
df['average'] = df[['math', 'english', 'science']].mean(axis=1)
df['grade'] = df['average'].map(
    lambda x: 'A' if x >= 90 else 'B' if x >= 85 else 'C'
)
print("\nPandas - 学生の成績:")
print(df[['student', 'average', 'grade']])

# 成績優秀者
top = df[df['grade'] == 'A']
print(f"\nA評価の学生: {top['student'].tolist()}")

# 科目ごとの統計
print("\n科目ごとの統計:")
print(df[['math', 'english', 'science']].describe())
TEXT 📖 参照専用
> **出力:** ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)してから進めてくださいね。実際の値はpandasのバージョンによって若干異なる場合があります。

期待される出力(抜粋):

TEXT 📖 参照専用
NumPy - 学生ごとの平均(位置指定):
  学生 0: 87.7
  学生 1: 89.0
  学生 2: 78.3

Pandas - 学生の成績:
   student  average grade
0    Alice     87.7     B
1      Bob     89.0     B
2  Charlie     78.3     C
3    Carol     92.0     A
4    David     88.3     B

A評価の学生: ['Carol']

科目ごとの統計:
        math  english  science
count   5.00     5.00     5.00
mean   87.60    87.20    86.40
std     6.19     3.70     7.60
min    78.00    82.00    75.00
max    95.00    91.00    93.00

NumPyでも計算はできますが、結果には「自己記述性」が欠けています。どの数字がどの学生に対応するかを別途覚えておかなければなりません。Pandasはデータとラベルを常に紐付けたまま保つので、結果が一目で分かりますね。



7. インストールと確認

(1) インストール方法

方法 コマンド ユースケース
pip pip install pandas 最も汎用的
conda conda install pandas Anaconda環境
ソースから pip install . 開発者/コントリビューター
💡 ヒント: Pandasは依存関係としてNumPyを自動的にインストールします。すでにNumPyがインストールされている場合は、Pandasは既存のバージョンを再利用します。

▶ サンプル:インストールの確認(難易度 ⭐)

TEXT 📖 参照専用
> **出力:** ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)してから進めてくださいね。実際の値はpandasのバージョンによって若干異なる場合があります。
PYTHON
import pandas as pd
import numpy as np

print(f"Pandasのバージョン: {pd.__version__}")
print(f"NumPyのバージョン: {np.__version__}")

# 簡単な機能チェック
df = pd.DataFrame({'x': [1, 2, 3], 'y': [4, 5, 6]})
print(df)
print(f"\nxの平均: {df['x'].mean()}")
TEXT 📖 参照専用
> **出力:** ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)してから進めてくださいね。実際の値はpandasのバージョンによって若干異なる場合があります。

(2) バージョンに関する注意事項

バージョン ステータス 備考
Pandas 3.x 最新 2026年リリース、Copy-on-Writeがデフォルトで有効
Pandas 2.x 広く使用されている 2023年リリース、大幅な性能向上
Pandas 1.x レガシー 一部の構文は非推奨
⚠️ 注意: 本チュートリアルはPandas 2.x/3.x向けに書かれています。1.xの一部の構文(appendなど)は2.0で削除されており、ここでは使用しません。


❓ よくある質問

Q PandasとNumPyの関係は何ですか?
A PandasはNumPyの上に構築されています。DataFrameの数値列は内部的にはndarrayであり、数値列に対して演算を行うときは、実際にはNumPyの関数を呼び出しています。PandasはNumPyの上に、ラベル付きインデックス、混合型、欠損値処理、IOツールを追加したものです。
Q NumPyの後にPandasを学ぶのはなぜですか?
A NumPyは計算エンジンであり、Pandasはデータ分析ツールです。現実世界のデータには列名、混合型、欠損値、複数のファイル形式があり、これらをNumPyで処理するには大量の手作業が必要ですが、Pandasはネイティブにサポートしています。データ分析業務の95%はPandasで行われ、高性能な数値計算が必要なときだけNumPyに降りていきます。
Q DataFrameとExcelの違いは何ですか?
A 概念的には似ています(どちらも2次元テーブルです)が、DataFrameはプログラム可能です。Pythonコードで操作を自動化し、数百万行を処理し、機械学習ライブラリと連携し、Gitでバージョン管理できます。Excelは手作業での操作やレポート提示に優れていますが、DataFrameは自動化されたデータ処理パイプラインのために作られています。
Q PandasはSQLを置き換えられますか?
A 完全には置き換えられません。Pandasは分析的な作業(探索/クリーニング/変換)に優れ、SQLはクエリ的な作業(複数テーブルの結合/トランザクション/並行処理)に優れています。よくある組み合わせは、SQLでデータベースからデータを取得し、Pandasで分析するというものです。100万行未満のデータセットであれば、PandasはSQLの分析的な機能の大部分を置き換えられます。
Q Pandas 2.xと1.xの主な違いは何ですか?
A 3つの大きな変更点があります。(1)Copy-on-Writeがデフォルトで有効になり、ビューの誤った変更を防止します。(2)appendDataFrame.ixなどの非推奨APIが削除されました。(3)内部でPyArrowが使用され、性能が向上しました。本チュートリアルは2.x/3.xの構文を使用しています。1.xユーザーはアップグレードをおすすめします。
Q Pandasは大規模データでどの程度の性能ですか?
A Pandasは100万行規模のシングルマシン分析に非常に向いています。より大きなデータ(10億規模)の場合は、次の選択肢を検討してください。(1)Dask — Pandas APIの分散版。(2)Polars — より高速な代替ライブラリ(Rustで実装)。(3)PySpark — 分散コンピューティングフレームワーク。学習やプロトタイピングには、依然としてPandasが第一選択です。
Q なぜコードに「ローカルのPython環境が必要」と書かれているのですか?
A 当サイトのオンラインエディタはPandasの実行をサポートしていません(メモリとセキュリティの制約のため)。ローカルにPython+Pandasをインストールしてサンプルコードを実行してください。インストールはコマンド1つで完了します:pip install pandas

📖 まとめ


📝 練習問題

  1. 基礎(難易度 ⭐):Pandasをインストールし、確認コードを実行してpd.__version__が正しく出力されることを確認してください。3つの列(名前/年齢/都市)を持つDataFrameを作成し、表示してみましょう。
  2. 中級(難易度 ⭐⭐):同じ学生の成績データ(5人の学生/3科目)を、NumPyとPandasの両方で処理してください。各学生の平均点と、科目ごとの最高点を計算し、両アプローチのコード量と可読性を比較してみましょう。
  3. チャレンジ(難易度 ⭐⭐⭐):欠損値を含むデータをCSV文字列から読み込み、Pandasを使って、情報の確認 → 欠損値の補完 → カテゴリ別のグループ化と統計計算 → describeの出力を行ってください。すべてPandasだけで処理し、ループは使用しないでくださいね。

次へ:Series入門 →

Web-Tutorial.com

Web-Tutorial 技術チーム

複数の開発者によって共同維持されているプログラミングチュートリアルプラットフォーム。各チュートリアルは専門分野の開発者が執筆・レビューしています。正確で信頼性の高いコンテンツを目指しています — 問題を見つけた場合はお知らせください。

100%