Pandas: 【初心者向け】Pandas入門:NumPyとの違い・DataFrame基礎・インストール方法
NumPyはPythonにおける数値計算の性能問題を解決しましたが、現実世界のデータは「純粋な数値配列」よりもはるかに複雑です。列名があり、型が混在し、欠損値があり、ファイル形式も多岐にわたります。Pandasはまさにこのために作られました。SQLに匹敵するデータ操作能力をPythonに与えつつ、コードは簡潔で直感的に保てるのです。本セクションではNumPyの限界から出発し、なぜPandasがデータ分析の「アーミーナイフ」と呼ばれるのかを明らかにしていきますね。
1. 学べること
- ❶ NumPyでデータ分析を行う際の痛点(ペインポイント)
- ❷ Pandasの4つのコア優位性(ラベル付きインデックス/混合型/欠損値/IO)
- ❸ DataFrameとndarray/Excel/SQLの主な違い
- ❹ Pandasエコシステムの全体像
- ❺ Pandasのインストールと最初のプログラムの実行
2. NumPyからPandasへの進化
(1) 痛点:アリスの混合型ジレンマ
アリスは顧客データを扱う必要があるデータアナリストです。名前は文字列、年齢は整数、給与は浮動小数点数、入社日はdatetime値です。彼女はまずNumPyを試してみます。
▶ サンプル:NumPyが混合型データで苦戦する様子(難易度 ⭐)
> **出力:** ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)してから進めてくださいね。実際の値はpandasのバージョンによって若干異なる場合があります。
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()が必要
> **出力:** ローカルの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で混合型データを扱う(難易度 ⭐⭐)
> **出力:** ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)してから進めてくださいね。実際の値はpandasのバージョンによって若干異なる場合があります。
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]) # 条件でフィルタリング
> **出力:** ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)してから進めてくださいね。実際の値はpandasのバージョンによって若干異なる場合があります。
各列は独自の型を保ち、統計演算は自動的に機能し、条件フィルタリングはSQLと同じくらい直感的です。これこそがPandasの魅力ですね。
(3) メリット:4つのコア機能
PandasはNumPyの上に4つの重要な機能を追加しています。
| 機能 | NumPy | Pandas |
|---|---|---|
| ラベル付きインデックス | 整数位置でのアクセスのみ | 列名/行ラベルでアクセス |
| 混合型 | 配列ごとに1つの型 | 列ごとに独立した型 |
| 欠損値 | np.nan(浮動小数点のみ) |
NaN/NaT/pd.NA(完全カバレッジ) |
| データIO | np.loadtxt/np.savetxt |
CSV/Excel/JSON/SQL/Parquet/HDF5 |
3. Pandasのコア優位性の詳細
(1) ラベル付きインデックス:自己記述的なデータ
NumPyではarr[0]やarr[1, 2]のようにデータにアクセスします。「0列目が名前で、2列目が給与だ」と覚えておかなければなりません。Pandasなら、データ自身が語ってくれます。
▶ サンプル:ラベル付きインデックスと位置インデックスの比較(難易度 ⭐)
> **出力:** ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)してから進めてくださいね。実際の値はpandasのバージョンによって若干異なる場合があります。
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 — ラベルベースのアクセス
> **出力:** ローカルの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は浮動小数点型でしか動作しません。
▶ サンプル:欠損値処理の比較(難易度 ⭐)
> **出力:** ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)してから進めてくださいね。実際の値はpandasのバージョンによって若干異なる場合があります。
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 — 欠損値を自動でスキップ
> **出力:** ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)してから進めてくださいね。実際の値はpandasのバージョンによって若干異なる場合があります。
(4) 豊富なIOツール:ワンストップのデータハブ
▶ サンプル:Pandasでデータを読み書きする(難易度 ⭐)
> **出力:** ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)してから進めてくださいね。実際の値はpandasのバージョンによって若干異なる場合があります。
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')
> **出力:** ローカルの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にない機能があります。
- プログラム可能:Pythonコードですべての操作を自動化でき、完全に再現可能です
- 拡張可能:NumPy/Matplotlib/scikit-learnとシームレスに連携できます
- 大規模データに対応:数百万行も簡単に処理できます(Excelは約100万行が上限です)
- バージョン管理:コードファイルはGitで管理できますが、Excelのバイナリファイルはできません
5. Pandasエコシステムの全体像
(1) データサイエンスにおけるPandasの位置づけ
mindmap
root((Pandasエコシステム))
データ入力
CSV Excel JSON
SQLデータベース
Parquet HDF5
Webスクレイピング
データ処理
クリーニング
変換
結合
リシェイプ
データ分析
Groupby集計
ピボットテーブル
時系列
統計サマリー
データ出力
可視化 Matplotlib
機械学習 scikit-learn
レポート HTML Excel
基盤
NumPy ndarray
> **出力:** ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)してから進めてくださいね。実際の値はpandasのバージョンによって若干異なる場合があります。
(2) スタックにおけるPandasの役割
PandasはPythonデータサイエンススタックの中核に位置し、低レイヤーの計算と高レイヤーの分析を橋渡ししています。
| レイヤー | ツール | 役割 |
|---|---|---|
| 低レイヤー計算 | NumPy | 高性能な数値計算エンジン |
| データ処理 | Pandas | 表形式データの読み込み/クリーニング/変換/分析 |
| 可視化 | Matplotlib/Seaborn | チャートやプロット |
| 機械学習 | scikit-learn | モデルの訓練と予測 |
| ディープラーニング | PyTorch/TensorFlow | ニューラルネットワーク |
6. 完全な例:NumPyとPandasの全ワークフロー比較
▶ サンプル:学生の成績分析 — 全ワークフロー(難易度 ⭐⭐⭐)
> **出力:** ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)してから進めてくださいね。実際の値はpandasのバージョンによって若干異なる場合があります。
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())
> **出力:** ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)してから進めてくださいね。実際の値はpandasのバージョンによって若干異なる場合があります。
期待される出力(抜粋):
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 . |
開発者/コントリビューター |
▶ サンプル:インストールの確認(難易度 ⭐)
> **出力:** ローカルのPython環境(pandas 2.x)で実行してください。Pistonサーバーにはpandasがプリインストールされていません。ローカルにインストール(`pip install pandas`)してから進めてくださいね。実際の値はpandasのバージョンによって若干異なる場合があります。
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()}")
> **出力:** ローカルの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 | レガシー | 一部の構文は非推奨 |
appendなど)は2.0で削除されており、ここでは使用しません。
❓ よくある質問
appendやDataFrame.ixなどの非推奨APIが削除されました。(3)内部でPyArrowが使用され、性能が向上しました。本チュートリアルは2.x/3.xの構文を使用しています。1.xユーザーはアップグレードをおすすめします。pip install pandas。📖 まとめ
- PandasはNumPyの上に4つのコア機能を追加しています:ラベル付きインデックス、混合型、欠損値処理、豊富なIOツール
- DataFrame ≈ プログラム可能なExcelシート ≈ メモリ内のSQLテーブルですが、自動化/拡張性/バージョン管理の優位性があります
- PandasはPythonデータサイエンススタックの中核に位置します:NumPy → Pandas → Matplotlib/scikit-learn
- データ分析業務の95%はPandasで行われ、NumPyは下位の計算エンジンです
- Pandas 2.x/3.xが現在の主流バージョンで、1.xの一部の構文は非推奨です
- シングルマシンの容量を超えるデータは、Dask/Polars/PySparkへとスケールアップしましょう
📝 練習問題
- 基礎(難易度 ⭐):Pandasをインストールし、確認コードを実行して
pd.__version__が正しく出力されることを確認してください。3つの列(名前/年齢/都市)を持つDataFrameを作成し、表示してみましょう。 - 中級(難易度 ⭐⭐):同じ学生の成績データ(5人の学生/3科目)を、NumPyとPandasの両方で処理してください。各学生の平均点と、科目ごとの最高点を計算し、両アプローチのコード量と可読性を比較してみましょう。
- チャレンジ(難易度 ⭐⭐⭐):欠損値を含むデータをCSV文字列から読み込み、Pandasを使って、情報の確認 → 欠損値の補完 → カテゴリ別のグループ化と統計計算 → describeの出力を行ってください。すべてPandasだけで処理し、ループは使用しないでくださいね。