プロジェクト

全般

プロフィール

Python Pandas

はじめに

公式サイト

https://pandas.pydata.org

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

10 minutes to 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")


13日前に更新