🐼 ステップ22: Pandasとは?DataFrameを作ろう
データ分析の最強ツール、Pandasを使い始めよう!
ステップ21まででNumPyを学びました。今回からは、データ分析のための最も重要なライブラリ「Pandas」を学んでいきます。PandasはExcelのような「表形式のデータ」を扱うためのツールです。
📖 このステップで学ぶこと
・Pandasとは何か、どんなことができるか
・DataFrame(データフレーム)の基本
・辞書やリストからDataFrameを作成する方法
・CSVファイルの読み込み方
・DataFrameの構造を確認する方法
学習時間の目安: 2.5〜3時間
🎯 1. Pandasとは?
まず、「Pandas」とは何かを理解しましょう。
🔰 Pandasの基本的な意味
Pandas(パンダス)とは、Pythonで表形式のデータを扱うためのライブラリです。
📌 Pandasのイメージ
Excelで表を作ったことはありますか?
Pandasは、Pythonの中でExcelのような表を作って操作できるツールです。
違いは、プログラムで自動的に処理できること。
100万行のデータでも、一瞬で計算できます!
📘 Pandasでできること
Pandasを使うと、以下のようなことが簡単にできます。
| できること | 具体例 |
| ファイル読み書き | Excel、CSVファイルを読み込む・保存する |
| データ抽出 | 「売上が100万以上」のデータだけ取り出す |
| 集計・計算 | 合計、平均、グループ別集計 |
| データ加工 | 列の追加、データの結合、形式変換 |
| 欠損値処理 | 空白データを見つけて埋める・削除する |
💡 なぜ「Pandas」という名前?
Panel Data(パネルデータ)という統計用語から来ています。
かわいいパンダ🐼のイメージもあって覚えやすいですね!
📘 ExcelとPandasの比較
「Excelがあれば十分では?」と思うかもしれません。比較してみましょう。
| 項目 | Excel | Pandas |
| 操作方法 | マウスで手作業 | プログラムで自動化 |
| データ量 | 約100万行が限界 | メモリの許す限り |
| 処理速度 | 大量データは遅い | 高速処理が可能 |
| 再現性 | 手順を覚えていないと再現困難 | コードを実行すれば同じ結果 |
📦 2. Pandasを使う準備
Pandasを使うための準備をしましょう。
🔰 Google Colabではすでにインストール済み
Google Colabを使っている場合、Pandasは最初から使える状態です。NumPyと同じですね。
📝 Pandasをインポートする
Pandasを使うには、まずインポートする必要があります。
📝 Pandasのインポート方法
import pandas as pd
・import pandas:Pandasライブラリを読み込む
・as pd:「pd」という短い名前で使えるようにする
コード:Pandasのインポート
# Pandasをインポート(pdという名前で使うのが一般的)
import pandas as pd
# バージョンを確認
print(pd.__version__)
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
2.2.2
💡 なぜ「pd」と略すの?
データ分析の世界では、「import pandas as pd」がお約束になっています。
毎回「pandas.DataFrame」と書くより、「pd.DataFrame」の方が短くて楽だからです。
NumPyの「np」と同じ考え方ですね。
📘 NumPyも一緒にインポートする
Pandasは内部でNumPyを使っています。そのため、両方を一緒にインポートすることが多いです。
コード:PandasとNumPyのインポート
# PandasとNumPyをインポート
import pandas as pd
import numpy as np
# バージョンを確認
print("Pandas version:", pd.__version__)
print("NumPy version:", np.__version__)
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
Pandas version: 2.2.2 NumPy version: 1.26.4
📊 3. DataFrameとは?
Pandasの中心となるデータ構造「DataFrame」について学びましょう。
🔰 DataFrameの基本的な意味
DataFrame(データフレーム)とは、表形式のデータ構造です。Excelのシート1枚分をイメージしてください。
📌 DataFrameのイメージ
Excelで「名前」「年齢」「都市」という列を作り、データを入力した表を想像してください。
DataFrameは、まさにその「表」をPythonの中で扱えるようにしたものです。
📘 DataFrameの構造
DataFrameには3つの重要な要素があります。
| 要素 | 説明 | 例 |
| 行(Row) | 各レコード(データ1件分) | 太郎さんのデータ1行 |
| 列(Column) | 各項目(データの種類) | 「名前」「年齢」「都市」 |
| インデックス | 行を識別する番号や名前 | 0, 1, 2… または ID番号 |
📘 最初のDataFrameを作ってみよう
実際にDataFrameを作成して、その構造を確認しましょう。
まず、データを辞書で用意します。
コード:辞書でデータを準備
# データを辞書で準備する
# キー → 列名になる
# 値(リスト) → その列のデータになる
data = {
'名前': ['太郎', '花子', '次郎'],
'年齢': [25, 23, 27],
'都市': ['東京', '大阪', '名古屋']
}
※ 画面が小さい場合は、コードブロックを横にスクロールできます
💡 辞書のポイント
キー(’名前’, ‘年齢’, ‘都市’)が列名になります。
値(リスト)がその列のデータになります。
各リストの長さは同じにする必要があります(全て3個ずつ)。
次に、pd.DataFrame()でDataFrameを作成します。
コード:DataFrameを作成
import pandas as pd
# データを辞書で準備
data = {
'名前': ['太郎', '花子', '次郎'],
'年齢': [25, 23, 27],
'都市': ['東京', '大阪', '名古屋']
}
# pd.DataFrame()でDataFrameを作成
# 引数に辞書を渡す
df = pd.DataFrame(data)
# 作成したDataFrameを表示
print(df)
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
名前 年齢 都市 0 太郎 25 東京 1 花子 23 大阪 2 次郎 27 名古屋
💡 実行結果の見方
左端の0, 1, 2:インデックス(行番号)です。自動で付きます。
上の「名前」「年齢」「都市」:列名(辞書のキー)です。
中のデータ:各列のデータ(辞書の値)です。
📘 DataFrameの基本情報を確認する
作成したDataFrameの情報を確認してみましょう。
コード:DataFrameの基本情報
import pandas as pd
data = {
'商品名': ['リンゴ', 'バナナ', 'オレンジ', 'イチゴ'],
'価格': [150, 100, 120, 300],
'在庫': [50, 80, 60, 30]
}
df = pd.DataFrame(data)
print("【DataFrame】")
print(df)
print()
# shape属性で行数と列数を確認
# (行数, 列数)のタプルが返る
print("形状(行数, 列数):", df.shape)
# len()で行数を取得
print("行数:", len(df))
# len(df.columns)で列数を取得
print("列数:", len(df.columns))
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
【DataFrame】 商品名 価格 在庫 0 リンゴ 150 50 1 バナナ 100 80 2 オレンジ 120 60 3 イチゴ 300 30 形状(行数, 列数): (4, 3) 行数: 4 列数: 3
🔨 4. DataFrameの作成方法
DataFrameを作る方法はいくつかあります。順番に見ていきましょう。
📘 方法1:辞書から作成(最も基本)
先ほど学んだ方法です。もう一度確認しましょう。
📝 辞書からDataFrameを作成する書き方
df = pd.DataFrame(辞書)
・辞書のキー → 列名
・辞書の値(リスト) → その列のデータ
コード:テストの点数データ
import pandas as pd
# テストの点数データを辞書で準備
scores_data = {
'名前': ['太郎', '花子', '次郎', '美咲', '健太'],
'数学': [85, 92, 78, 88, 90],
'英語': [90, 88, 82, 95, 87],
'国語': [78, 85, 88, 82, 91]
}
# DataFrameを作成
df = pd.DataFrame(scores_data)
print(df)
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
名前 数学 英語 国語 0 太郎 85 90 78 1 花子 92 88 85 2 次郎 78 82 88 3 美咲 88 95 82 4 健太 90 87 91
📘 方法2:リストのリストから作成
データを「行ごと」に持っている場合は、リストのリストを使います。
📝 リストのリストからDataFrameを作成する書き方
df = pd.DataFrame(リスト, columns=[‘列名1’, ‘列名2’, …])
・各リスト → 1行分のデータ
・columns引数 → 列名を指定(必須)
コード:リストのリストから作成
import pandas as pd
# データをリストのリストで準備
# 各リストが1行分のデータ
data = [
['太郎', 25, '東京'], # 1行目
['花子', 23, '大阪'], # 2行目
['次郎', 27, '名古屋'] # 3行目
]
# columns引数で列名を指定
df = pd.DataFrame(data, columns=['名前', '年齢', '都市'])
print(df)
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
名前 年齢 都市 0 太郎 25 東京 1 花子 23 大阪 2 次郎 27 名古屋
💡 辞書とリストのリストの使い分け
辞書:列(項目)ごとにデータがまとまっている時
リストのリスト:行(レコード)ごとにデータがまとまっている時
どちらでも同じDataFrameが作れます。データの形に合わせて選びましょう。
📘 方法3:NumPy配列から作成
NumPy配列をDataFrameに変換することもできます。
コード:NumPy配列から作成
import pandas as pd
import numpy as np
# NumPy配列を作成(3行3列)
arr = np.array([
[100, 200, 300],
[110, 220, 330],
[120, 240, 360]
])
# DataFrameに変換
# columns引数で列名を指定
# index引数で行のインデックス名を指定
df = pd.DataFrame(arr,
columns=['商品A', '商品B', '商品C'],
index=['店舗1', '店舗2', '店舗3'])
print(df)
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
商品A 商品B 商品C 店舗1 100 200 300 店舗2 110 220 330 店舗3 120 240 360
💡 index引数について
index引数で、行のインデックス(左端の番号)を自分で設定できます。
指定しない場合は、0, 1, 2…の番号が自動で付きます。
📁 5. CSVファイルの読み込み
実際のデータ分析では、CSVファイルからデータを読み込むことが多いです。
🔰 CSVファイルとは?
CSV(Comma-Separated Values)は、カンマで区切られたテキストファイルです。
📌 CSVファイルの中身(例)
名前,年齢,都市 太郎,25,東京 花子,23,大阪 次郎,27,名古屋
1行目が列名、2行目以降がデータです。
Excelでも開けますが、中身は単純なテキストです。
📝 read_csv()でファイルを読み込む
📝 CSVファイルの読み込み方
df = pd.read_csv(‘ファイル名.csv’)
・ファイル名を指定するだけで読み込める
・自動的にDataFrameが作成される
コード:CSVファイルの読み込み(デモ)
import pandas as pd
# 実際のファイルを読み込む場合
# df = pd.read_csv('data.csv')
# デモ用:文字列からDataFrameを作成
# (実際の作業ではこの方法は使いません)
sample_data = """名前,年齢,都市,年収
太郎,25,東京,400
花子,23,大阪,380
次郎,27,名古屋,420
美咲,24,福岡,390
健太,26,札幌,410"""
from io import StringIO
df = pd.read_csv(StringIO(sample_data))
print(df)
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
名前 年齢 都市 年収 0 太郎 25 東京 400 1 花子 23 大阪 380 2 次郎 27 名古屋 420 3 美咲 24 福岡 390 4 健太 26 札幌 410
📘 read_csv()のよく使うオプション
ファイルによっては、オプションを指定する必要があります。
| オプション | 意味 | 使用例 |
| encoding | 文字コードを指定 | encoding=’utf-8′ または ‘shift-jis’ |
| index_col | 指定した列をインデックスに | index_col=0(最初の列) |
| header | 列名の行を指定 | header=None(列名なし) |
| sep | 区切り文字を指定 | sep=’\t’(タブ区切り) |
💡 文字化けしたら?
日本語のCSVファイルで文字化けする場合は、encodingを指定してみましょう。
・Excelで作ったCSV → encoding=’shift-jis’
・それ以外 → encoding=’utf-8′
🔍 6. DataFrameの構造を確認する
作成したDataFrameの構造を確認する方法を学びましょう。
📘 列名とインデックスを確認
コード:列名とインデックスの確認
import pandas as pd
data = {
'商品名': ['リンゴ', 'バナナ', 'オレンジ', 'イチゴ', 'ブドウ'],
'価格': [150, 100, 120, 300, 250],
'在庫': [50, 80, 60, 30, 40],
'カテゴリ': ['果物', '果物', '果物', '果物', '果物']
}
df = pd.DataFrame(data)
print("【DataFrame】")
print(df)
print()
# columns属性で列名を取得
print("列名:", df.columns.tolist())
# index属性でインデックスを取得
print("インデックス:", df.index.tolist())
# shape属性で形状を取得
print("形状:", df.shape)
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
【DataFrame】 商品名 価格 在庫 カテゴリ 0 リンゴ 150 50 果物 1 バナナ 100 80 果物 2 オレンジ 120 60 果物 3 イチゴ 300 30 果物 4 ブドウ 250 40 果物 列名: ['商品名', '価格', '在庫', 'カテゴリ'] インデックス: [0, 1, 2, 3, 4] 形状: (5, 4)
📘 データ型を確認
各列がどんなデータ型かを確認しましょう。
コード:データ型の確認
import pandas as pd
data = {
'名前': ['太郎', '花子', '次郎'],
'年齢': [25, 23, 27],
'身長': [175.5, 162.3, 180.0],
'会員': [True, True, False]
}
df = pd.DataFrame(data)
print("【DataFrame】")
print(df)
print()
# dtypes属性で各列のデータ型を確認
print("各列のデータ型:")
print(df.dtypes)
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
【DataFrame】 名前 年齢 身長 会員 0 太郎 25 175.5 True 1 花子 23 162.3 True 2 次郎 27 180.0 False 各列のデータ型: 名前 object 年齢 int64 身長 float64 会員 bool dtype: object
📌 Pandasの主なデータ型
| データ型 | 意味 | 例 |
| object | 文字列 | ‘太郎’, ‘東京’ |
| int64 | 整数 | 25, 100 |
| float64 | 小数 | 175.5, 3.14 |
| bool | 真偽値 | True, False |
| datetime64 | 日付・時刻 | 2024-01-01 |
💾 7. DataFrameの保存
作成したDataFrameをファイルに保存する方法を学びましょう。
📝 to_csv()でCSVファイルとして保存
📝 CSVファイルの保存方法
df.to_csv(‘ファイル名.csv’, index=False)
・index=False:インデックス(行番号)を保存しない
・encoding=’utf-8′:文字コードを指定
コード:CSVファイルとして保存
import pandas as pd
data = {
'商品名': ['リンゴ', 'バナナ', 'オレンジ'],
'価格': [150, 100, 120],
'在庫': [50, 80, 60]
}
df = pd.DataFrame(data)
print("【DataFrame】")
print(df)
# CSVファイルとして保存
# df.to_csv('products.csv', index=False, encoding='utf-8')
print()
print("【保存する場合のコード】")
print("df.to_csv('products.csv', index=False, encoding='utf-8')")
print()
print("・index=False → 行番号を保存しない")
print("・encoding='utf-8' → 文字コードを指定")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
【DataFrame】
商品名 価格 在庫
0 リンゴ 150 50
1 バナナ 100 80
2 オレンジ 120 60
【保存する場合のコード】
df.to_csv('products.csv', index=False, encoding='utf-8')
・index=False → 行番号を保存しない
・encoding='utf-8' → 文字コードを指定
📘 to_excel()でExcelファイルとして保存
コード:Excelファイルとして保存
import pandas as pd
data = {
'年月': ['2024-01', '2024-02', '2024-03'],
'売上': [1200, 1350, 1500]
}
df = pd.DataFrame(data)
print("【DataFrame】")
print(df)
# Excelファイルとして保存
# df.to_excel('sales.xlsx', index=False, sheet_name='売上')
print()
print("【保存する場合のコード】")
print("df.to_excel('sales.xlsx', index=False, sheet_name='売上')")
print()
print("・sheet_name='売上' → シート名を指定")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
【DataFrame】
年月 売上
0 2024-01 1200
1 2024-02 1350
2 2024-03 1500
【保存する場合のコード】
df.to_excel('sales.xlsx', index=False, sheet_name='売上')
・sheet_name='売上' → シート名を指定
📝 練習問題
ここまで学んだことを、実際に手を動かして確認しましょう。
問題1:辞書からDataFrameを作成(初級)
📋 問題
以下のデータを持つDataFrameを作成してください。
・都市名: [‘東京’, ‘大阪’, ‘名古屋’, ‘福岡’]
・人口(万人): [1400, 880, 230, 160]
・面積(km²): [2194, 225, 326, 343]
解答例を見る
コード
import pandas as pd
data = {
'都市名': ['東京', '大阪', '名古屋', '福岡'],
'人口': [1400, 880, 230, 160],
'面積': [2194, 225, 326, 343]
}
df = pd.DataFrame(data)
print(df)
print()
print("形状:", df.shape)
print("列名:", df.columns.tolist())
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
都市名 人口 面積 0 東京 1400 2194 1 大阪 880 225 2 名古屋 230 326 3 福岡 160 343 形状: (4, 3) 列名: ['都市名', '人口', '面積']
問題2:リストからDataFrameを作成(初級)
📋 問題
以下のデータをリストのリストで表現し、DataFrameを作成してください。
データ: [[‘太郎’, 85, 90], [‘花子’, 92, 88], [‘次郎’, 78, 95]]
列名: [‘名前’, ‘数学’, ‘英語’]
解答例を見る
コード
import pandas as pd
data = [
['太郎', 85, 90],
['花子', 92, 88],
['次郎', 78, 95]
]
df = pd.DataFrame(data, columns=['名前', '数学', '英語'])
print(df)
print()
print("データ型:")
print(df.dtypes)
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
名前 数学 英語 0 太郎 85 90 1 花子 92 88 2 次郎 78 95 データ型: 名前 object 数学 int64 英語 int64 dtype: object
問題3:インデックス付きDataFrame(中級)
📋 問題
以下の商品データをDataFrameにし、商品名をインデックスに設定してください。
商品: [‘リンゴ’, ‘バナナ’, ‘オレンジ’, ‘イチゴ’]
価格: [150, 100, 120, 300]
在庫: [50, 80, 60, 30]
解答例を見る
コード
import pandas as pd
data = {
'商品': ['リンゴ', 'バナナ', 'オレンジ', 'イチゴ'],
'価格': [150, 100, 120, 300],
'在庫': [50, 80, 60, 30]
}
df = pd.DataFrame(data)
# set_index()で商品名をインデックスに設定
df = df.set_index('商品')
print(df)
print()
print("インデックス:", df.index.tolist())
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
価格 在庫 商品 リンゴ 150 50 バナナ 100 80 オレンジ 120 60 イチゴ 300 30 インデックス: ['リンゴ', 'バナナ', 'オレンジ', 'イチゴ']
問題4:NumPy配列からDataFrame(中級)
📋 問題
3行4列のNumPy配列(1〜12の連続した数)を作成し、DataFrameに変換してください。
列名: [‘A列’, ‘B列’, ‘C列’, ‘D列’]
インデックス: [‘1行目’, ‘2行目’, ‘3行目’]
解答例を見る
コード
import pandas as pd
import numpy as np
# 1〜12の配列を3行4列に整形
arr = np.arange(1, 13).reshape(3, 4)
# DataFrameに変換
df = pd.DataFrame(arr,
columns=['A列', 'B列', 'C列', 'D列'],
index=['1行目', '2行目', '3行目'])
print("NumPy配列:")
print(arr)
print()
print("DataFrame:")
print(df)
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
NumPy配列:
[[ 1 2 3 4]
[ 5 6 7 8]
[ 9 10 11 12]]
DataFrame:
A列 B列 C列 D列
1行目 1 2 3 4
2行目 5 6 7 8
3行目 9 10 11 12
問題5:複数のデータ型を含むDataFrame(上級)
📋 問題
以下の情報を持つDataFrameを作成し、各列のデータ型を確認してください。
・社員ID: [101, 102, 103, 104]
・名前: [‘佐藤’, ‘鈴木’, ‘田中’, ‘高橋’]
・年齢: [28, 35, 42, 31]
・年収: [450.5, 580.0, 720.5, 520.0](万円)
・正社員: [True, True, False, True]
解答例を見る
コード
import pandas as pd
data = {
'社員ID': [101, 102, 103, 104],
'名前': ['佐藤', '鈴木', '田中', '高橋'],
'年齢': [28, 35, 42, 31],
'年収': [450.5, 580.0, 720.5, 520.0],
'正社員': [True, True, False, True]
}
df = pd.DataFrame(data)
print("DataFrame:")
print(df)
print()
print("各列のデータ型:")
print(df.dtypes)
print()
print(f"行数: {len(df)}")
print(f"列数: {len(df.columns)}")
print(f"形状: {df.shape}")
※ 画面が小さい場合は、コードブロックを横にスクロールできます
実行結果
DataFrame: 社員ID 名前 年齢 年収 正社員 0 101 佐藤 28 450.5 True 1 102 鈴木 35 580.0 True 2 103 田中 42 720.5 False 3 104 高橋 31 520.0 True 各列のデータ型: 社員ID int64 名前 object 年齢 int64 年収 float64 正社員 bool dtype: object 行数: 4 列数: 5 形状: (4, 5)
🎯 このステップのまとめ
✅ 学んだこと
✓ Pandasはデータ分析の最強ツール
✓ import pandas as pdでインポート
✓ DataFrameは表形式のデータ構造
✓ 辞書、リストのリスト、NumPy配列からDataFrameを作成できる
✓ pd.read_csv()でCSVファイルを読み込める
✓ shape、columns、index、dtypesで構造を確認できる
✓ to_csv()、to_excel()でファイルに保存できる
💡 次のステップに進む前に確認
以下のことができるようになったか確認しましょう:
□ Pandasをインポートできる
□ 辞書からDataFrameを作成できる
□ DataFrameの行数・列数を確認できる
□ 列名とインデックスを確認できる
□ 各列のデータ型を確認できる
これらができたら、次のステップに進みましょう!
❓ よくある質問
Q1: PandasとNumPyの違いは何ですか?
A: NumPyは数値計算に特化し、全ての要素が同じ型の配列を扱います。Pandasは表形式のデータを扱い、列ごとに異なる型(名前は文字列、年齢は数値など)を持てます。Pandasは内部でNumPyを使っているので、両方使えることが多いです。
Q2: DataFrameとExcelの違いは?
A: Excelは手作業でデータを操作、DataFrameはプログラムで自動処理します。DataFrameは大量のデータを高速に処理でき、処理を繰り返し実行できるので、データ分析に向いています。
Q3: インデックスは必要ですか?
A: 必須ではありませんが、行を識別するのに便利です。日付、ID、名前などをインデックスにすると、データの抽出や結合が簡単になります。指定しない場合は0, 1, 2…の番号が自動的に付きます。
Q4: CSVファイルが日本語だと文字化けします
A: encoding=’utf-8′またはencoding=’shift-jis’を指定してください。Excelで作ったCSVは‘shift-jis’、それ以外は‘utf-8’が多いです。どちらかわからない場合は両方試してみましょう。
Q5: DataFrameのサイズに制限はありますか?
A: メモリの許す限り扱えます。Google Colabなら数GB程度まで大丈夫です。非常に大きなデータ(数GB以上)の場合は、chunksize(分割読み込み)やDaskなど別のツールを検討します。
学習メモ
Pythonデータ分析入門 - Step 22