Python 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 となり、見つかった場合そのインデックス番号となります。