Pandas入門：データ分析を加速するためのチートシート


Pandasは、Pythonでデータ操作や分析を行うための主要なライブラリの一つです。Excelのように表形式のデータを扱いやすい上に、SQLライクな操作も可能で、機械学習やデータ解析の前処理にも広く使われています。ここでは、Pandasを初めて使う方や、これからPandasをちゃんと使いこなしたいと思っている方のために、**チートシート**のような形で基礎と実践的な使い方をまとめました。  

## 1. Pandasとは？

Pandasは、Pythonを使ったデータ分析や数値計算、統計解析などに幅広く活用されているライブラリです。NumPy配列をベースに、行と列を持つ二次元データ構造を扱いやすく拡張しているため、下記のような特徴があります。

- **DataFrame**と呼ばれる表形式のデータ構造が使いやすい  
- **ExcelやCSV、SQLデータベース**など、さまざまなフォーマットからデータを読み込む機能  
- データの**集計・結合・グルーピング・ソート・フィルタリング**などの操作を簡潔に実行できる  
- 既存のPythonエコシステムとの親和性が高い（Matplotlib、Seaborn、Scikit-learnなど）

---

## 2. インストールと基本セットアップ

Pandasを使用するには、以下のコマンドでインストール可能です。

```bash
pip install pandas
```

もしくは、Anaconda環境を利用している場合は標準で入っていることが多いです。  
Jupyter NotebookやPythonの対話環境で使う際は、次のようにインポートしておくのが定番です。

```python
import pandas as pd
import numpy as np  # 数値計算ライブラリNumPyもよく一緒に使う
```

> **補足**  
> Pandasを`pd`と略してインポートするのは慣例的に行われています。コードが読みやすくなるためオススメです。

---

## 3. データの読み込み・書き出し

Pandasが便利なのは、さまざまなフォーマットのデータを簡単に読み書きできることです。代表的な関数と例をいくつか紹介します。

### CSV

```python
# CSVファイルの読み込み
df = pd.read_csv('data.csv')

# CSVファイルへの書き出し
df.to_csv('output.csv', index=False)  # index=Falseで行番号(インデックス)を出力しない
```

### Excel

```python
# Excelファイルの読み込み（デフォルトは1枚目のシート）
df_excel = pd.read_excel('data.xlsx', sheet_name='Sheet1')

# Excelファイルへの書き出し
df_excel.to_excel('output.xlsx', index=False)
```

### JSON

```python
# JSONファイルの読み込み
df_json = pd.read_json('data.json')

# JSONファイルの書き出し
df_json.to_json('output.json', orient='records')
```

### SQL

```python
import sqlite3

conn = sqlite3.connect('example.db')
df_sql = pd.read_sql_query("SELECT * FROM table_name", conn)

# SQLテーブルへの書き込み
df_sql.to_sql('table_name_new', conn, if_exists='replace', index=False)
conn.close()
```

---

## 4. DataFrameの基本操作

### データの確認・概要

まずはDataFrameの中身を確認するためのメソッドをいくつか押さえておきましょう。

```python
df.head()       # 先頭5行(デフォルト)を表示
df.tail(3)      # 末尾3行を表示
df.shape        # (行数, 列数)をタプルで返す
df.columns      # 列名の一覧
df.index        # インデックスの一覧
df.info()       # データ型や行数、欠損値等の情報
df.describe()   # 数値列の基本統計量(平均, 標準偏差, 四分位数など)
```

### 列・行の操作

```python
# 列名の変更
df.rename(columns={'old_name': 'new_name'}, inplace=True)

# 新しい列の追加（例：他の列の計算結果）
df['total'] = df['price'] * df['quantity']

# 列の削除
df.drop('column_to_drop', axis=1, inplace=True)

# 行の削除
df.drop([0, 1], axis=0, inplace=True)  # 0,1行目を削除
```

> **補足**  
> `inplace=True`を指定すると、元のDataFrameが直接書き換えられます。元のDataFrameを保持しておきたい場合は指定しないか、別の変数に格納しましょう。

### インデックス操作

```python
# 既存の列をインデックスに設定
df.set_index('id', inplace=True)

# インデックスを初期化
df.reset_index(inplace=True)

# インデックス名の変更
df.index.name = 'new_index_name'
```

---

## 5. データ抽出・フィルタリング

### loc と iloc

- `loc`は**ラベル(列名や行名)** を使って行・列を指定  
- `iloc`は**整数インデックス(0始まり)** を使って行・列を指定  

```python
# 行ラベルで指定：loc
df.loc[10]              # インデックスが10の行
df.loc[10, 'col_name']  # インデックスが10の行、col_name列

# 行番号で指定：iloc
df.iloc[0]            # 先頭行
df.iloc[0:5, 2:4]     # 行0~4、列2~3のスライス
```

### 条件に基づく抽出

```python
# 条件式をDataFrameに与えるとTrue/Falseのブール配列が返る
df[df['price'] > 100]               # priceが100より大きい行
df[(df['price'] > 100) & (df['qty'] < 5)]  # 複数条件のAND
df[(df['category'] == 'Food') | (df['category'] == 'Drink')]  # OR条件
df[df['description'].str.contains('apple')]   # 部分文字列検索
```

---

## 6. 欠損値の扱い

データ解析や前処理において欠損値がある場合の処理は重要です。Pandasでは、欠損値を`NaN`として扱います。

### 欠損値の検出

```python
df.isnull()         # 欠損があるとTrue、ないとFalseを返す
df.isnull().sum()   # 列ごとの欠損数を合計
```

### 欠損値の置換・削除

```python
# 欠損値を平均値や特定の値で埋める
df['price'].fillna(df['price'].mean(), inplace=True)
df['category'].fillna('Unknown', inplace=True)

# 欠損を含む行を削除
df.dropna(axis=0, how='any', inplace=True)  # any -> 1つでもNaNがある行を削除
```

---

## 7. 統計量の把握

### 基本統計量

```python
df['price'].mean()     # 平均
df['price'].median()   # 中央値
df['price'].std()      # 標準偏差
df['price'].max()      # 最大値
df['price'].min()      # 最小値
df['price'].quantile(0.25)  # 四分位数
```

### グルーピング

```python
# グループ化してから集計
df.groupby('category')['price'].mean()

# 複数の列でグループ化し、集計
df.groupby(['category', 'brand'])['price'].agg(['mean','max','min'])
```

> `agg`(aggregation)を使うと、複数の集計関数を同時に適用できます。

---

## 8. データの結合・マージ

Pandasは、RDBのように**結合(merge/join)** を簡単に行えます。

```python
df1 = pd.DataFrame({
    'key': [1, 2, 3],
    'val1': ['A', 'B', 'C']
})

df2 = pd.DataFrame({
    'key': [1, 2, 4],
    'val2': ['X', 'Y', 'Z']
})

# SQLのJOINに相当（デフォルトはinner join）
merged = pd.merge(df1, df2, on='key', how='inner')  
# how='outer', 'left', 'right' を指定することで結合の種類を変更可能
```

> **外部結合(outer)** や**左結合(left)**、**右結合(right)** などがよく使用されます。

---

## 9. ピボットテーブル・クロス集計

エクセルでも馴染みのある**ピボットテーブル**のような操作がPandasでも可能です。

```python
df_pivot = df.pivot_table(
    values='price',
    index='category',
    columns='brand',
    aggfunc='mean'
)
```

また、クロス集計を行いたい場合は`pd.crosstab`を使います。

```python
pd.crosstab(df['category'], df['brand'])
```

---

## 10. 文字列操作

Pandasでは文字列に対しても便利なメソッドが用意されています。Seriesの`str`アクセサを使うことで、文字列の加工や検索などが簡単にできます。

```python
df['name'].str.lower()       # 小文字化
df['name'].str.upper()       # 大文字化
df['name'].str.strip()       # 前後の空白除去
df['name'].str.replace('-', ' ')  # 文字置換

# 正規表現(Regex)も使用可能
df['description'].str.contains(r'^\d+')
```

---

## 11. 時系列データの扱い

時系列データを扱う場合は、以下の方法で日付型を活用すると便利です。

```python
df['date'] = pd.to_datetime(df['date'])  # 文字列から日時型に変換
df.set_index('date', inplace=True)       # インデックスを日時に設定

# リサンプリング (例：日次 -> 月次の平均)
df_monthly = df.resample('M').mean()

# 日付の一部情報を取り出す
df.index.year
df.index.month
df.index.day
df.index.weekday
```

---

## 12. グラフ化（簡易プロット）

Pandasは、Matplotlibをバックエンドとして簡単にグラフを描画できます。Jupyter Notebookを使用している場合は、インラインでグラフを表示できます。

```python
%matplotlib inline  # (Jupyter Notebookで使う場合)
df['price'].plot()  # 折れ線グラフ

# ヒストグラム
df['price'].hist(bins=20)

# 箱ひげ図(Boxplot)
df.boxplot(column='price', by='category', figsize=(8, 6))
```

より凝った可視化をしたい場合は、SeabornやPlotly、Bokehなどのライブラリと組み合わせるのもオススメです。

---

## 13. Tips：高速化や大規模データ

Pandasは非常に強力ですが、**数百万行を超えるような大規模データ**を扱う場合、以下の工夫が必要になることがあります。

- **dtypeを指定**して読み込む（メモリ節約）  
  ```python
  df = pd.read_csv('data.csv', dtype={'id': 'int32', 'price': 'float32'})
  ```
- **chunk単位**で分割して読み込む  
  ```python
  # CSVを少しずつ読み込む
  chunk_iter = pd.read_csv('data.csv', chunksize=100000)
  for chunk_df in chunk_iter:
      # chunk_df単位で処理
      pass
  ```
- 大規模データ処理に特化したライブラリ（**Dask**や**Modin**など）を検討

また、インデックスを適切に利用して検索・抽出を高速化することも有効です。

---

## 14. まとめ

Pandasは機械学習や統計分析の前処理だけでなく、ちょっとしたデータ集計や管理にも非常に便利です。本記事では、Pandasの基礎～よく使う機能をチートシート形式でざっくりまとめました。ぜひサンプルコードを手元で試しながら、自分の業務や趣味プロジェクトに適用してみてください。


### 参考リンク

- [Pandas公式ドキュメント (英語)](https://pandas.pydata.org/docs/)
- [Pandas Cookbook (英語)](https://github.com/jvns/pandas-cookbook)
- [Pandasチートシート (英語, PDF)](https://pandas.pydata.org/Pandas_Cheat_Sheet.pdf)

最後まで読んでいただき、ありがとうございました。Pandasを使いこなせるようになると、データ分析や前処理の効率が飛躍的に上がります。ぜひ活用してください！