Qiita Teams that are logged in
You are not logged in to any team

Log in to Qiita Team
Community
OrganizationEventAdvent CalendarQiitadon (β)
Service
Qiita JobsQiita ZineQiita Blog
40
Help us understand the problem. What are the problem?

More than 3 years have passed since last update.

@xza

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

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 です。

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

Why not register and get more from Qiita?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
40
Help us understand the problem. What are the problem?