プロジェクト

全般

プロフィール

Python Pandas

はじめに

公式サイト

https://pandas.pydata.org

公式サイトのドキュメントメモ

10 minutes to pandas

インストールとセットアップ

pip install pandas

慣習的に、pdの別名でpandasモジュールをインポートします。

import pandas as pd

依存ライブラリ

2026-10-25時点でpandas 3.1.0 をインストールすると、次が依存関係でインストールされました。

  • numpy 2.5.4
  • python_dateutil 3.0.0
    • six 1.17.0
  • tzdata 2026.5

簡単なpandasの概要

pandasは、DataFrame(データフレーム)という構造でデータを保持し、ファイルからデータフレームへの読み込みとファイルへの書き出し、データフレームのデータ解析を行うライブラリです。
データフレームは、行と列で構成される表形式の順序付けられ名前が付けられたデータ構造です。
読み込み・書き出し可能なファイル形式は、csv, Excel, HTML, HDF5, JSON, 他です。
df = pd.read_csv("foo.csv")

データの可視化(プロット)は範疇外です。matplotlibなどの別ライブラリと組み合わせます。

データ構造にはDataFrameの他、Seriesが提供されます。Seriesは、連続した同じ型の1次元のベクトで、v = pd.Series([1, 2, 3, 5, 7]) のように使います。

DataFrame

行と列のテーブル構造を持つクラスです。

  • 行名(index)
  • 列名(columns)
  • データ(values)

行名と列名は、ハッシュ値を持つオブジェクト(実質すべてのオブジェクト)を指定可能。

要素(セル)の値を指定

要素の値を2次元配列(リストのリスト)で指定します。

>>> pd.DataFrame([["Tokyo-to","Tokyo",2103.97],["Kanagawa-ken","Yokohama",2415.86]])
              0         1        2
0      Tokyo-to     Tokyo  2103.97
1  Kanagawa-ken  Yokohama  2415.86
  • 行名(index)は生成時に指定していないので、自動で0から始まる連番が生成されます
  • 列名(columns)は生成時に指定していないので、自動で0から始まる連番が生成されます
  • 値(values)は生成時に指定したリストのリストがセルに格納されます

要素(セル)の値と列名を指定

列名のリストをキーワード引数columnsで指定
pd.DataFrame(
    [ ["Tokyo-to","Tokyo",2103.97], ["Kanagawa-ken","Yokohama",2415.86] ],
    columns=["都道府県名","県庁所在地","面積" 
)

     都道府県名  県庁所在地  面積
0      Tokyo-to     Tokyo    2103.97
1  Kanagawa-ken  Yokohama    2415.86
  • 行名(index)は生成時に指定していないので、自動で0から始まる連番が生成されます
  • 列名(columns)は生成時に指定したものが順番に設定されます
  • 値(values)は生成時に指定したリストのリストがセルに格納されます
列名をキーに、値を列データのリストとした辞書で指定
pd.DataFrame({
    "都道府県名": ["Tokyo-to", "Kanagawa-ken"],
    "県庁所在地": ["Tokyo", "Yokohama"],
    "面積": [2103.97,2415.86]
})

     都道府県名  県庁所在地  面積
0      Tokyo-to     Tokyo    2103.97
1  Kanagawa-ken  Yokohama    2415.86
  • 行名(index)は生成時に指定していないので、自動で0から始まる連番が生成されます
  • 列名(columns)は生成時に指定した辞書のキーが順番に設定されます
  • 値(values)は生成時に指定した辞書の値(リスト)がキーの列に格納されます
行名の指定を追加
pd.DataFrame(
    {
        "都道府県名": ["Tokyo-to", "Kanagawa-ken"],
        "県庁所在地": ["Tokyo", "Yokohama"],
        "面積": [2103.97,2415.86]
    },
    index=[1, 2]
)

     都道府県名  県庁所在地  面積
1      Tokyo-to     Tokyo    2103.97
2  Kanagawa-ken  Yokohama    2415.86
  • 行名(index)は生成時にindexキーワード引数で指定したリストが設定されます
  • 列名(columns)は生成時に指定した辞書のキーが順番に設定されます
  • 値(values)は生成時に指定した辞書の値(リスト)がキーの列に格納されます

APIの使い方

生成

DataFrameの生成

2次元のデータを用意しDataFrameのコンストラクタに渡します。

リストのリスト、numpyの2次元ndarrayで渡すと、行と列のインデックス/カラムが0からの連番で自動生成されます。
辞書型のデータに、キーおよびリストまたは1次元のndarrayを値に詰めて渡すと、列名がキーとなり行のインデックスが0からの連番で自動生成されます。

次は、辞書型のデータに、DataFrameの列名をキーに、列の値のリストをバリューに持たせて DataFrameに渡して生成するコードです。リストの要素数は全て同じにする必要があります。

data = {
  "state": ["Ohio", "Ohio", "Ohio", "Nevada", "Nevada", "Nevada"],
  "year" : [2000,   2001,   2002,   2001,     2002,     2003],
  "pop":   [1.5,    1.7,    3.6,    2.4,      2.9,      3.2]
}
frame = pd.DataFrame(data)

生成されるDataFrameは次のようになります。

    state    year    pop
0   Ohio     2000    1.5
1   Ohio     2001    1.7
2   Ohio     2002    3.6
3   Nevada   2001    2.4
4   Nevada   2002    2.9
5   Nevada   2003    3.2
  • 列はディクショナリーに追加した順
  • インデックスが自動的に作られる、インデックス名はなし

列順を明示的に指定して生成
frame = pd.DataFrame(data, columns=["year", "state", "pop"])

生成時に、ディクショナリーにないキーを空の列で追加
frame = pd.DataFrame(data, columns=["year", "state", "pop", "debt"])
→ ディクショナリーにない列には欠損値(NaN)が代入

外部データの読み込み(CSV)

ヘッダー付きのCSVファイルを読み込み、DataFrameオブジェクトに格納します。

df = pd.read_csv('sample_with_header.csv')
  • コメント行を読み飛ばすには、comment='#' のようにオプションを指定
  • ヘッダーが先頭行にない場合は、行数が分かれば skiprows=3 のように先頭から指定行を読み飛ばす
  • ヘッダーを置き換えたい場合、namems=('A', 'B', 'C') header=0 と指定
    • header=None と指定すると、CSVファイルの先頭がデータとして読み込まれてしまう
    • データの列数と列名のリストの要素数がミスマッチの時は、列名が後ろに合うように付与される模様
  • デフォルトは文字コード utf-8 として扱う。utf-8以外のときは明示的に encoding="CP932" などと指定
  • 読み込んだデータの行数、列数:df.shape タプルで(行数、列数)が返る
  • ヘッダーの列名リスト:df.columns
  • データのリスト:df.values

ヘッダーなしのCSVファイルを読み込み、列名の情報を別途与えてDataFrameオブジェクトに格納

column_names = ['id', 'code', 'name', 'quantity']
df = pd.read_csv('sample_without_header.csv', names=column_names, header=None)
  • ヘッダーのないCSVファイルからデータを読み込むとき(先頭からデータとして読み込む)、header=None を指定

既存のDataFrameから抽出して生成

既存のDataFrameから、指定した列のみを抽出したDataFrameを生成します。

df = DataFrame(dict(alfa=a, bravo=b, charlie=c, delta=d))
extract_columns = ["bravo", "delta"]
new_df = df[extract_columns].copy()
  • copy()をしておくと、new_dfを変更しても元のDataFrameには影響しない。copy()がない場合、Pandasのバージョンや条件によって影響がありえる。

DataFrameへのアクセス

DataFrameの構造・状況

要素数

len(df)

列名

df.columns.values

DataFrameからデータの取り出し

head および tail
  • 最初の5行を抽出: df.head(5)
  • 最後の5行を抽出: df.tail(5)
単一のデータ取り出し(at, iat)
  • 行と列の名前を指定して一つの値を取得:at
  • 行と列のインデックスを指定して一つの値を取得:iat
    インデックスは0オリジン
複数のデータ取り出し(loc, iloc)
  • 行と列の名前を指定して一つまたは複数の値を取得:df.loc[2, "age"]
    3行目の列名ageに対応する列を指定(行はインデックス指定も可?)
  • 行と列のインデックスを指定して一つまたは複数の値を取得:df.iloc[0,2]
    0オリジンで行と列を指定

スライスやリストを使用して複数の値を取得可能です。

  • loc[3, :] で行を取得できる。loc[3] と省略も可能
  • 列名をリストで指定したとき、名前付きタプルらしきものが返る df.loc[1, ["name", "age"]]
列名を指定し列を取得
  • データを列名指定して取得: states = df["state"] Series型で取得、df.year と属性アクセス形式でも取得可

DataFrameのイテレート

行をイテレート

iterrows()

df = DataFrame(data)
for index, row in df.iterrows():
    state = row["state"]
  • rowは、Series型

itertuples()

for row in df.itertuples():
    row[0] # index値
    row[1] # 最初の列の値
  • rowは、namedtuple型
  • Seriesを生成しないので型の変換、オーバーヘッドがiterrowsより小さい

イテレートはビューを返すので、イテレートの値を変更しても元のDataFrameには反映されない。

loc/iloc で行だけを指定

for i in range(len(df):
    row = df.iloc[i]
  • rowは、Series型

DataFrameに列を追加

列名を指定して値を代入

df["area"] = areas

  • スカラー値を指定すると、その列のすべての要素が指定した値に設定
  • リストやndarrayを指定すると、そのデータが格納されるが、要素数が一致していないとエラーになる
  • Seriesを指定するとその要素が設定される。SeriesのindexがDataFrameのindexと一致しない要素はNaNが設定される
assign()で代入

df.assign(area=areas)

insert()で代入

df.insert(1, "area", areas)

  • 既存の列名を指定するとエラー
注意点

列の追加を大量に繰り返すときは、性能劣化に要注意。
辞書型にもたせて最後にDataFrame化する等

指定した列名をインデックスとする

df2 = df.set_index("number")

検索

タイムスタンプで検索

DataFrameのインデックスをタイムスタンプ(時系列)としているとき

前提条件

  • インデックスがタイムスタンプである
  • インデックスが昇順にソート済みである

get_indexer(method="nearest") で 2分探索で最も近いタイムスタンプのインデックス名を返却

target_time = [pd.to_datetime("2026-10-25 10:21:32")]
pos = df.index.get_indexer(target_time, method="nearest")
row = df.iloc[pos]

methodには次も指定可能

  • "ffill" 指定したタイムスタンプより前で最も近いものを返却
  • "bfill" 指定したタイムスタンプより後で最も近いものを返却

見つからない場合は戻り値が -1 となり、見つかった場合そのインデックス番号となります。


約8時間前に更新