pandas は Python で 表形式のデータ を扱うための中心ライブラリです。J-Quants API から取得したデータも、最終的にはほぼ pandas の DataFrame に整形して使うことになります。
本記事では、pandas の最重要オブジェクトである DataFrame と Series を、株価 CSV を読み込みながら一通り扱います。
目次
- インストール
- サンプルデータの準備
- CSV を読み込む
- DataFrame の中身を確認する
- 列を取り出す = Series
- 列単位の基本集計
- 行を絞り込む(条件抽出)
- 列の追加と計算
- 日付列を扱う
- インデックスを付け替える
- 銘柄ごとに集計する
インストール
pip install pandas検証バージョン: Python 3.12.5 / pandas 2.2.3
サンプルデータの準備
学習用の小さな CSV を用意します。stocks.csv という名前で次の内容を保存してください。
Date,Code,C,Vo2026-04-01,7203,2900,110000002026-04-02,7203,2925,95000002026-04-03,7203,2880,125000002026-04-01,9984,9800,42000002026-04-02,9984,9750,51000002026-04-03,9984,9900,4800000Date は日付、Code は銘柄コード、C は終値(円)、Vo は出来高です。
CSV を読み込む
import pandas as pd
df = pd.read_csv("stocks.csv")print(df)実行すると、次のような表が出力されます。
Date Code C Vo0 2026-04-01 7203 2900 110000001 2026-04-02 7203 2925 95000002 2026-04-03 7203 2880 125000003 2026-04-01 9984 9800 42000004 2026-04-02 9984 9750 51000005 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 29001 29252 28803 98004 97505 9900Name: C, dtype: int64Series は「1 列ぶんの値 + ラベル(インデックス)」のセットです。DataFrame は「複数の Series を束ねたもの」と考えると分かりやすくなります。
列単位の基本集計
Series に対しては、平均・最大・最小などの集計関数がそのまま使えます。
print(df["C"].mean()) # 5692.5print(df["C"].max()) # 9900print(df["C"].min()) # 2880print(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 amount0 2026-04-01 7203 2900 11000000 31900000000...C と Vo は Series ですが、Series 同士の四則演算は 要素ごと(同じ位置同士) に行われます。これが pandas の強みです。
日付列を扱う
日付列は読み込み直後は文字列ですが、pd.to_datetime で日付型にできます。
df["Date"] = pd.to_datetime(df["Date"])print(df.dtypes)# Date datetime64[ns]# ...日付型にすると、年月日の取り出し・期間フィルタなど、日付特有の操作ができるようになります。
df["year"] = df["Date"].dt.yeardf["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 weekdayCode Date7203 2026-04-01 2900 11000000 31900000000 2026 Wednesday 2026-04-02 2925 9500000 27787500000 2026 Thursday 2026-04-03 2880 12500000 36000000000 2026 Friday9984 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_volumeCode7203 2902 330000009984 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_csv→head/describeで「まず形を見る」のが定石- 行の絞り込みは真偽値 Series を
[ ... ]に渡す - 列の追加は代入で完結する
groupbyで銘柄別・期間別の集計が書ける