pandas は Python で 表形式のデータ を扱うための中心ライブラリです。J-Quants API から取得したデータも、最終的にはほぼ pandas の DataFrame に整形して使うことになります。

本記事では、pandas の最重要オブジェクトである DataFrameSeries を、株価 CSV を読み込みながら一通り扱います。

目次

  1. インストール
  2. サンプルデータの準備
  3. CSV を読み込む
  4. DataFrame の中身を確認する
  5. 列を取り出す = Series
  6. 列単位の基本集計
  7. 行を絞り込む(条件抽出)
  8. 列の追加と計算
  9. 日付列を扱う
  10. インデックスを付け替える
  11. 銘柄ごとに集計する

インストール

Terminal window
pip install pandas

検証バージョン: Python 3.12.5 / pandas 2.2.3

サンプルデータの準備

学習用の小さな CSV を用意します。stocks.csv という名前で次の内容を保存してください。

Date,Code,C,Vo
2026-04-01,7203,2900,11000000
2026-04-02,7203,2925,9500000
2026-04-03,7203,2880,12500000
2026-04-01,9984,9800,4200000
2026-04-02,9984,9750,5100000
2026-04-03,9984,9900,4800000

Date は日付、Code は銘柄コード、C は終値(円)、Vo は出来高です。

CSV を読み込む

import pandas as pd
df = pd.read_csv("stocks.csv")
print(df)

実行すると、次のような表が出力されます。

Date Code C Vo
0 2026-04-01 7203 2900 11000000
1 2026-04-02 7203 2925 9500000
2 2026-04-03 7203 2880 12500000
3 2026-04-01 9984 9800 4200000
4 2026-04-02 9984 9750 5100000
5 2026-04-03 9984 9900 4800000

この表全体が DataFrame です。pd.read_csv は CSV を一発で DataFrame に変換します。

DataFrame の中身を確認する

最初に必ず行う「形を見る」操作です。

print(df.shape) # (6, 4) — 行数と列数
print(df.columns.tolist()) # ['Date', 'Code', 'C', 'Vo']
print(df.dtypes) # 各列のデータ型
print(df.head(3)) # 先頭 3 行
print(df.tail(3)) # 末尾 3 行
print(df.describe()) # 数値列の統計量(件数、平均、標準偏差、最小、最大など)

列を取り出す = Series

DataFrame から列を 1 つ取り出すと、それは Series になります。

close = df["C"]
print(type(close)) # <class 'pandas.core.series.Series'>
print(close)
0 2900
1 2925
2 2880
3 9800
4 9750
5 9900
Name: C, dtype: int64

Series は「1 列ぶんの値 + ラベル(インデックス)」のセットです。DataFrame は「複数の Series を束ねたもの」と考えると分かりやすくなります。

列単位の基本集計

Series に対しては、平均・最大・最小などの集計関数がそのまま使えます。

print(df["C"].mean()) # 5692.5
print(df["C"].max()) # 9900
print(df["C"].min()) # 2880
print(df["Vo"].sum()) # 47100000

複数列をまとめて要約したいときは describe() が便利です。

行を絞り込む(条件抽出)

「ある条件に合う行だけ取り出す」操作はとてもよく使います。

toyota = df[df["Code"] == 7203]
print(toyota)

df["Code"] == 7203真偽値の Series(各行が True / False)を返し、それを df[ ... ] の中に入れると True の行だけが残ります。

複数条件は &(かつ)・|(または)で繋ぎます。各条件をカッコで囲む のが必須です。

high_volume = df[(df["Code"] == 7203) & (df["Vo"] > 10_000_000)]
print(high_volume)

列の追加と計算

新しい列は 代入だけで作れます

df["amount"] = df["C"] * df["Vo"]
print(df.head())
Date Code C Vo amount
0 2026-04-01 7203 2900 11000000 31900000000
...

CVo は Series ですが、Series 同士の四則演算は 要素ごと(同じ位置同士) に行われます。これが pandas の強みです。

日付列を扱う

日付列は読み込み直後は文字列ですが、pd.to_datetime で日付型にできます。

df["Date"] = pd.to_datetime(df["Date"])
print(df.dtypes)
# Date datetime64[ns]
# ...

日付型にすると、年月日の取り出し・期間フィルタなど、日付特有の操作ができるようになります。

df["year"] = df["Date"].dt.year
df["weekday"] = df["Date"].dt.day_name()
print(df.head())

インデックスを付け替える

set_index で特定の列をインデックスにできます。日付や銘柄コードをインデックスにすると、後の集計が見やすくなります。

df_indexed = df.set_index(["Code", "Date"]).sort_index()
print(df_indexed)
C Vo amount year weekday
Code Date
7203 2026-04-01 2900 11000000 31900000000 2026 Wednesday
2026-04-02 2925 9500000 27787500000 2026 Thursday
2026-04-03 2880 12500000 36000000000 2026 Friday
9984 2026-04-01 9800 4200000 41160000000 2026 Wednesday
2026-04-02 9750 5100000 49725000000 2026 Thursday
2026-04-03 9900 4800000 47520000000 2026 Friday

銘柄ごとに集計する

groupby で「銘柄ごとの平均」「銘柄ごとの合計」などが書けます。

agg = df.groupby("Code").agg(
mean_close=("C", "mean"),
sum_volume=("Vo", "sum"),
)
print(agg)
mean_close sum_volume
Code
7203 2902 33000000
9984 9817 14100000

集計の詳細は#4-3「pandas で集計・グループ化」 で扱います。

生成AI へのプロンプト例

データ加工の処理は、生成AI と相性が良い領域です。

次の CSV を pandas で読み込み、銘柄コード(Code)ごとの
日次平均終値・出来高合計・最大ドローダウン日(終値が前日比で
最も下がった日付)を含む DataFrame を作るコードを書いてください。
入力ファイル: stocks.csv
列: Date, Code, C, Vo
要件:
- Date は datetime64 に変換
- 結果の DataFrame を CSV (output.csv) に保存
- 不要な intermediate な print は出さない
- pandas のバージョンは 2.2 系を想定

要件・入力・出力を区切って書くと、ブレの少ないコードが返ります(#7-2「データ分析のためのプロンプト設計」)。

まとめ

  • DataFrame は 2 次元の表、Series は 1 列(または 1 行) に対応する
  • read_csvhead / describe で「まず形を見る」のが定石
  • 行の絞り込みは真偽値 Series を [ ... ] に渡す
  • 列の追加は代入で完結する
  • groupby で銘柄別・期間別の集計が書ける