はじめに
pandasはPythonでデータ分析を行うための必須ライブラリです。表形式のデータを効率的に操作できます。
インストール
pip install pandas
基本概念
Series(1次元データ)
import pandas as pd
# Seriesの作成
s = pd.Series([1, 2, 3, 4, 5])
print(s)
# インデックス付き
s = pd.Series([100, 200, 300], index=["apple", "banana", "orange"])
print(s["apple"]) # 100
DataFrame(2次元データ)
# 辞書から作成
data = {
"name": ["太郎", "花子", "次郎"],
"age": [25, 22, 30],
"city": ["東京", "大阪", "名古屋"]
}
df = pd.DataFrame(data)
print(df)
# 出力:
# name age city
# 0 太郎 25 東京
# 1 花子 22 大阪
# 2 次郎 30 名古屋
データの読み込み
# CSV
df = pd.read_csv("data.csv")
df = pd.read_csv("data.csv", encoding="utf-8")
# Excel
df = pd.read_excel("data.xlsx", sheet_name="Sheet1")
# JSON
df = pd.read_json("data.json")
# SQLデータベース
import sqlite3
conn = sqlite3.connect("database.db")
df = pd.read_sql("SELECT * FROM users", conn)
データの書き出し
# CSV
df.to_csv("output.csv", index=False, encoding="utf-8")
# Excel
df.to_excel("output.xlsx", index=False)
# JSON
df.to_json("output.json", orient="records", force_ascii=False)
データの確認
df.head() # 最初の5行
df.tail(10) # 最後の10行
df.shape # (行数, 列数)
df.columns # 列名一覧
df.dtypes # 各列のデータ型
df.info() # データフレームの情報
df.describe() # 統計情報
列・行の選択
# 列の選択
df["name"] # 1列(Series)
df[["name", "age"]] # 複数列(DataFrame)
# 行の選択
df.iloc[0] # インデックス番号で選択
df.iloc[0:3] # スライス
df.loc[0] # ラベルで選択
# 条件による選択
df[df["age"] > 25]
df[(df["age"] > 20) & (df["city"] == "東京")]
df[df["name"].str.contains("郎")]
列の追加・変更・削除
# 列の追加
df["country"] = "日本"
df["birth_year"] = 2026 - df["age"]
# 列の変更
df["age"] = df["age"] + 1
# 列の削除
df = df.drop(columns=["country"])
del df["birth_year"]
欠損値の処理
# 欠損値の確認
df.isnull().sum()
# 欠損値を含む行を削除
df = df.dropna()
# 欠損値を埋める
df["age"] = df["age"].fillna(0)
df["age"] = df["age"].fillna(df["age"].mean())
# 前後の値で埋める
df = df.fillna(method="ffill") # 前の値
df = df.fillna(method="bfill") # 後の値
データの集計
# 基本統計
df["age"].mean() # 平均
df["age"].sum() # 合計
df["age"].max() # 最大
df["age"].min() # 最小
df["age"].std() # 標準偏差
df["age"].count() # カウント
# 値のカウント
df["city"].value_counts()
# グループ化
df.groupby("city")["age"].mean()
df.groupby("city").agg({
"age": ["mean", "max"],
"name": "count"
})
# ピボットテーブル
pd.pivot_table(df, values="age", index="city", aggfunc="mean")
データの結合
# 縦結合
df1 = pd.DataFrame({"A": [1, 2], "B": [3, 4]})
df2 = pd.DataFrame({"A": [5, 6], "B": [7, 8]})
df = pd.concat([df1, df2], ignore_index=True)
# 横結合(merge)
users = pd.DataFrame({
"user_id": [1, 2, 3],
"name": ["太郎", "花子", "次郎"]
})
orders = pd.DataFrame({
"user_id": [1, 1, 2],
"product": ["りんご", "みかん", "バナナ"]
})
# INNER JOIN
df = pd.merge(users, orders, on="user_id")
# LEFT JOIN
df = pd.merge(users, orders, on="user_id", how="left")
データの並べ替え
# 1列でソート
df = df.sort_values("age")
df = df.sort_values("age", ascending=False) # 降順
# 複数列でソート
df = df.sort_values(["city", "age"], ascending=[True, False])
# インデックスでソート
df = df.sort_index()
データの変換
# 型変換
df["age"] = df["age"].astype(int)
df["date"] = pd.to_datetime(df["date"])
# 値の置換
df["city"] = df["city"].replace({"東京": "Tokyo", "大阪": "Osaka"})
# apply関数
df["name_len"] = df["name"].apply(len)
df["age_group"] = df["age"].apply(lambda x: "若者" if x < 30 else "大人")
# map関数
df["city_code"] = df["city"].map({"東京": "TKY", "大阪": "OSK"})
日付データの処理
df["date"] = pd.to_datetime(df["date"])
# 日付の要素を抽出
df["year"] = df["date"].dt.year
df["month"] = df["date"].dt.month
df["day"] = df["date"].dt.day
df["weekday"] = df["date"].dt.day_name()
# 日付でフィルタ
df[df["date"] >= "2026-01-01"]
df[(df["date"] >= "2026-01-01") & (df["date"] < "2026-02-01")]
# 期間でグループ化
df.groupby(df["date"].dt.to_period("M"))["sales"].sum()
実践例:売上データ分析
import pandas as pd
# サンプルデータの作成
data = {
"date": pd.date_range("2026-01-01", periods=100, freq="D"),
"product": ["A", "B", "C", "D"] * 25,
"region": ["東日本", "西日本"] * 50,
"sales": [100 + i * 10 + (i % 7) * 5 for i in range(100)],
"quantity": [10 + i % 20 for i in range(100)]
}
df = pd.DataFrame(data)
# 基本情報
print(f"期間: {df['date'].min()} 〜 {df['date'].max()}")
print(f"総売上: {df['sales'].sum():,}円")
print(f"平均売上: {df['sales'].mean():,.0f}円")
# 商品別売上
product_sales = df.groupby("product")["sales"].agg(["sum", "mean", "count"])
print("\n商品別売上:")
print(product_sales.sort_values("sum", ascending=False))
# 地域別・商品別売上
pivot = pd.pivot_table(
df,
values="sales",
index="region",
columns="product",
aggfunc="sum"
)
print("\n地域別・商品別売上:")
print(pivot)
# 月別推移
df["month"] = df["date"].dt.to_period("M")
monthly = df.groupby("month")["sales"].sum()
print("\n月別売上:")
print(monthly)
# 結果を保存
df.to_csv("sales_analysis.csv", index=False, encoding="utf-8")
まとめ
DataFrameは表形式データを扱う中心的なオブジェクトread_csv/to_csvでCSVファイルを読み書きiloc/locで行を選択、df[列名]で列を選択groupbyでグループ化して集計mergeでテーブルを結合applyで各要素に関数を適用
次回はmatplotlibでデータ可視化を学びます。