Edited at

Python データ処理ライブラリ Pandas の導入とそのデータ型

More than 1 year has passed since last update.


Pandas に 関して

「Pandas」は Python のライブラリで、データを効率的に解析するためのライブラリです。

「行列的」にデータを扱う事ができ、データ処理を強力に実行できます。

マニュアル等は公式サイトを参照してください。

Python Data Analysis Library — pandas: Python Data Analysis Library


Pandas の インストール

以下のリンク先の手順で環境を構築した場合はインストールは不要です。

その他の方法で環境を構築した場合は以下の手順が必要です。

pip install pandas


Pandas の データ型の理解

Pandas を利用する場合はまずはデータ型を理解する必要があります。

Pandas は以下の3種類のデータ構造が扱えます。

型名
概要

Series
1次元データ

DataFrame
2次元データ

Panel
3次元データ

まずは、ライブラリの import をします。

import pandas as pd


Series

基本は「Series」です。

Series は「1次元データ」を扱うためのPandasのデータ型です。

list から生成できます


cnt = pd.Series([10, 20, 30, 50, 80, 130])
cnt

    0     10

1 20
2 30
3 50
4 80
5 130
dtype: int64

型は type で確認できます。

type(cnt)

    pandas.core.series.Series

値を取得する場合は「values」で簡単に取得できます。

cnt.values

    array([ 10,  20,  30,  50,  80, 130])

index を取得できます。デフォルトだと rangeになっています。

cnt.index

    RangeIndex(start=0, stop=6, step=1)

index に値を指定する事も可能です。

cnt = pd.Series([10, 20, 30, 50, 80, 130],

index=['a', 'b', 'c', 'd', 'e', 'f'])
cnt

    a     10

b 20
c 30
d 50
e 80
f 130
dtype: int64

dictのように取得も可能です。

cnt['b']

    20

list の内包表記が利用できます。以下は index を利用して、判定しています。

[v in ('a', 'd') for v in cnt.index]

    [True, False, False, True, False, False]

True/False の list を渡すと、True の値のみ抽出が可能です。

cnt[[v in ('a', 'd') for v in cnt.index]]

    a    10

d 50
dtype: int64

内部的には deep copy されているため、操作した後でも元の値は変化しません。

cnt

    a     10

b 20
c 30
d 50
e 80
f 130
dtype: int64

value の比較で抽出も可能です。

cnt[cnt > 100]

    f    130

dtype: int64

最初 list から作成しましたが、dict から作成する事も可能です。

d = {'a': 300, 'b': 400}

newcnt = pd.Series(d)
newcnt

    a    300

b 400
dtype: int64

二つの Series は 加算する事ができますが、index が不足した部分は 「NaN」になります。

NaN は「計算不能」を表す値で、 Null とは多少異なる数値です。Null に近い flaot です。

pandas の場合、列の型が混在すると問題ですので、NaN でないと型が混在してしまいます。

型混在によるバグやエラーは対処がしずらい場合がありますので、注意してください。


cnt + newcnt

    a    310.0

b 420.0
c NaN
d NaN
e NaN
f NaN
dtype: float64

括弧で囲んで、関数を適用できます。「isnull」は「NaN or Null」かどうか判定します

(cnt + newcnt).isnull()

    a    False

b False
c True
d True
e True
f True
dtype: bool


DataFrame

DataFrame は2次元を扱うためのPandasのデータ型です。

DataFrame は Series を「列」にもつ型です。

data = pd.DataFrame([cnt, newcnt])

data




a
b
c
d
e
f




0
10.0
20.0
30.0
50.0
80.0
130.0


1
300.0
400.0
NaN
NaN
NaN
NaN

型も確認してみます.


type(data)

    pandas.core.frame.DataFrame

直接生成もできます。

list から生成する場合は columns を指定すると列名が指定できます。

data_a = pd.DataFrame([[1, 2], [3, 4], [5, 6]], columns=['a', 'b'])

data_a




a
b




0
1
2


1
3
4


2
5
6

dict で生成する場合は、「行」ではなく「列」毎に値を生成します。

dictのkeyが「列」名、valueが「行」の数分値が必要になります。valueの数に不足があるとエラーになります。


d = {
'a': [1, 2, 3],
'b': [5, 6, 7],
}
data_b = pd.DataFrame(d)
data_b




a
b




0
1
5


1
2
6


2
3
7

data




a
b
c
d
e
f




0
10.0
20.0
30.0
50.0
80.0
130.0


1
300.0
400.0
NaN
NaN
NaN
NaN

特定列だけ抽出してみます。

data[['b', 'a']]




b
a




0
20.0
10.0


1
400.0
300.0

内部のデータ型を取れます。


data.dtypes

    a    float64

b float64
c float64
d float64
e float64
f float64
dtype: object

列の値を取得したい場合は、以下2種類の方法で取れます。

プログラムで、変数を利用して取得する場合等は、key を利用した取得の方が利用するでしょう。


data.a
data['a']

    0     10.0

1 300.0
Name: a, dtype: float64

取得できた物が Series である事も確認してみます。


type(data['a'])

    pandas.core.series.Series

列は列名で取得できますが、行は「loc」で取得します。


data.loc[1]

    a    300.0

b 400.0
c NaN
d NaN
e NaN
f NaN
Name: 1, dtype: float64

行で取得しても 型は Series です。


type(data.loc[1])

    pandas.core.series.Series


Panel

「Panel」は3次元データを扱えます。

2次元データのDataFrameがSeries で構成されていた事から予想できるように、「Panel」は「DataFrame」から構成されます。

data

data_a
data_b

pd.Panel({'1': data, '2': data_a, '3': data_b})

    <class 'pandas.core.panel.Panel'>

Dimensions: 3 (items) x 3 (major_axis) x 6 (minor_axis)
Items axis: 1 to 3
Major_axis axis: 0 to 2
Minor_axis axis: a to f

3次元のデータを利用すると、時系列データの分析など、DataFrameを多層に保持するデータの分析が気軽にできます。

扱いは DataFrme と同じ感覚で扱えます。


様々なデータを扱う

少し長くなってきたので、別の文章で記述します。

以下のリンク先で続きを記述します。


書いた人に関して

Tech Fun株式会社スペシャリスト、xza です。

社内で開催した初学者向け勉強会で利用した資料等を公開しています。