Python Pandas¶
はじめに¶
公式サイト¶
公式サイトのドキュメントメモ¶
インストールとセットアップ¶
pip install pandas
慣習的に、pdの別名でpandasモジュールをインポートします。
import pandas as pd
簡単な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]) のように使います。
APIの使い方¶
生成¶
DataFrameの生成¶
- 同じ長さを持つ1つ以上のリスト型の値から生成
- NumPy配列から生成
辞書型のデータに、列名をキーに、列の値のリストをバリューに持たせて 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ファイルの先頭がデータとして読み込まれてしまう- データの列数と列名のリストの要素数がミスマッチの時は、列名が後ろに合うように付与される模様
- 読み込んだデータの行数、列数:
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からデータの取り出し¶
- 最初の5行を抽出:
df.head(5) - 最後の5行を抽出:
df.tail(5) - データを行列を数値で指定して取得:
df.iloc[0,2]0オリジンで行と列を指定 - データを行番号、列名で指定して取得:
df.loc[2, "age"]3行目の列名ageに対応する列を指定- 複数の行、または列の指定も可能、スライスまたはリストで指定
- 列名をリストで指定したとき、名前付きタプルらしきものが返る
df.loc[1, ["name", "age"]]
- データを列名指定して取得:
states = df["state"]Series型で取得、df.yearと属性アクセス形式でも取得可
DataFrameへデータ追加¶
- 列の追加は、
df["area"] = areas
指定した列名をインデックスとする¶
df2 = df.set_index("number")