Pandas入門(上)

Pandas

データ解析用ライブラリPandasの入門シリーズです。
Pandasでは、excelやcsvなどからのデータの読み込みや解析、グラフの描画などが高速、かつ、効率的に行うことができます。
今回の入門編では、公式ページの10 minutes to pandasの流れに沿って動作を確認していきます。

Pandasのインストール

pip install pandas

ソースコードで、pandasモジュールを読み込みます。

import numpy as np
import pandas as pd

numpyとセットで使われることが多いので、numpyも一緒に読み込んでおきます。

pandasオブジェクトの作成

1次元配列オブジェクトの作成

a = pd.Series(
    [1, 2, 3, 4, np.nan, 6, 7, 8, 9, 10]
)
print('a = ', a)

b = pd.date_range('20200609', periods=6)
print('b = ', b)
出力
a =  0     1.0
1     2.0
2     3.0
3     4.0
4     NaN
5     6.0
6     7.0
7     8.0
8     9.0
9    10.0
dtype: float64
b =  DatetimeIndex(['2020-06-09', '2020-06-10', '2020-06-11', '2020-06-12', '2020-06-13', '2020-06-14'],
              dtype='datetime64[ns]', freq='D')

pd.date_range()で日付型の要素を持った配列が生成できます。periods引数で、期間を設定しています。

2次元配列(テーブル型)の作成

c = pd.DataFrame(
    np.random.randn(6, 4), 
    index = b, 
    columns = list('ABCD')
) 
print('c = ', c) 

d = pd.DataFrame(
    {
        'A': 1.0,
        'B': pd.Timestamp('20200609'),
        'C': pd.Series(
            1,
            index=list(range(4)),
            dtype = 'float32'
        ),
        'D': np.array(
            [3] * 4, 
            dtype='int32'
        ),
        'E': pd.Categorical(
                ['test', 'train', 'test', 'train']
        ),  
        'F': 'foo'
    }
)
print('d = ', d)
出力
c =                     A         B         C         D
2020-06-09 -0.568155 -0.208802 -0.038764  0.070417
2020-06-10  0.790197  1.750673 -1.204253 -1.203343
2020-06-11  0.159510 -1.481566  0.651237 -2.499592
2020-06-12 -0.840938  0.256012 -0.560881  1.917525
2020-06-13 -0.628798 -0.590094 -1.814191  0.607754
2020-06-14 -1.823898 -1.195555 -0.857130  0.403937
d =       A          B    C  D      E    F
0  1.0 2020-06-09  1.0  3   test  foo
1  1.0 2020-06-09  1.0  3  train  foo
2  1.0 2020-06-09  1.0  3   test  foo
3  1.0 2020-06-09  1.0  3  train  foo

indexが行ヘッダ、columnsが列ヘッダを表しています。

作成したデータの確認

データ型を調べる

print(d.dtypes) 
出力
A           float64
B    datetime64[ns]
C           float32
D             int32
E          category
F            object
dtype: object

データの先頭部分、末尾部分を取得する

print(c.head())
print(c.tail())
print(c.tail(3))
出力
                   A         B         C         D
2020-06-09 -1.148820  0.559512 -0.270844 -1.119315
2020-06-10  1.155711 -1.284437 -0.094978 -0.542046
2020-06-11  0.502422 -0.908783  0.865800 -0.239080
2020-06-12 -0.313514  0.716692  0.249746  0.143688
2020-06-13 -0.845227 -0.504853  0.234423  0.361580
                   A         B         C         D
2020-06-10  1.155711 -1.284437 -0.094978 -0.542046
2020-06-11  0.502422 -0.908783  0.865800 -0.239080
2020-06-12 -0.313514  0.716692  0.249746  0.143688
2020-06-13 -0.845227 -0.504853  0.234423  0.361580
2020-06-14  0.370775  1.898906 -0.404837 -0.711529
                   A         B         C         D
2020-06-12 -0.313514  0.716692  0.249746  0.143688
2020-06-13 -0.845227 -0.504853  0.234423  0.361580
2020-06-14  0.370775  1.898906 -0.404837 -0.711529

head()、tail()の引数に何行取り出すかを指定できます。

print(c.index)
print(c.columns)
出力
DatetimeIndex(['2020-06-09', '2020-06-10', '2020-06-11', '2020-06-12',
               '2020-06-13', '2020-06-14'],
              dtype='datetime64[ns]', freq='D')
Index(['A', 'B', 'C', 'D'], dtype='object')

インデックス情報、列情報を確認しています。

pd.DataFrameオブジェクトをnumpyのarrayオブジェクトに変換します。

c_to_numpy = c.to_numpy()
print(c_to_numpy)
出力
[[ 1.3945224  -2.16639648  0.57689592  1.48256738]
 [ 1.29968647 -2.91909182  1.02403685 -0.31999603]
 [-0.86927512  0.07877687 -1.58678064  0.1163637 ]
 [-0.14015204 -0.7582679  -1.40456898 -0.79199917]
 [ 1.58617336 -0.75270374 -0.39788265  0.94861466]
 [-0.58671378 -2.53326774 -1.82278447  1.34084589]]

np.arrayオブジェクトに変換する際には、インデックス情報、列情報は残りません。

print(c.describe())
出力
              A         B         C         D
count  6.000000  6.000000  6.000000  6.000000
mean   0.147376 -0.296531  0.450643  0.177528
std    0.894601  0.922210  0.340619  0.725526
min   -1.190921 -1.673923 -0.018152 -0.853745
25%   -0.355276 -0.801286  0.269322 -0.039645
50%    0.229095 -0.194743  0.395687  0.017650
75%    0.834357  0.226281  0.738966  0.488701
max    1.130941  0.921070  0.850046  1.296637

describe()で統計情報を取得できます。
count(データの個数)、mean(平均)、std(標準偏差)、min(最小値)、25%(第1四分位数)、50%(中央値)、75%(第3四分位数)、max(最大値)となっています。

e = c.T
print('e = ', e)
出力
e =     2020-06-09  2020-06-10  2020-06-11  2020-06-12  2020-06-13  2020-06-14
A   -1.698692   -1.049570   -1.300102    0.810853    0.632688   -0.861506
B   -2.079725   -1.506159    0.862219   -0.892856   -0.845409   -0.809814
C   -0.103235    0.785892    1.135647   -0.219564   -0.093387   -1.640137
D    1.260371   -1.172984    0.775742    1.100353   -0.592993    0.595317

Tメッソッドで、転置行列を取得できます。

print(c.sort_index(axis=1, ascending=False))
print(c.sort_index(axis=1, ascending=True))
print(c.sort_values(by='B'))
出力
                   D         C         B         A
2020-06-09  1.260371 -0.103235 -2.079725 -1.698692
2020-06-10 -1.172984  0.785892 -1.506159 -1.049570
2020-06-11  0.775742  1.135647  0.862219 -1.300102
2020-06-12  1.100353 -0.219564 -0.892856  0.810853
2020-06-13 -0.592993 -0.093387 -0.845409  0.632688
2020-06-14  0.595317 -1.640137 -0.809814 -0.861506
                   A         B         C         D
2020-06-09 -1.698692 -2.079725 -0.103235  1.260371
2020-06-10 -1.049570 -1.506159  0.785892 -1.172984
2020-06-11 -1.300102  0.862219  1.135647  0.775742
2020-06-12  0.810853 -0.892856 -0.219564  1.100353
2020-06-13  0.632688 -0.845409 -0.093387 -0.592993
2020-06-14 -0.861506 -0.809814 -1.640137  0.595317
                   A         B         C         D
2020-06-09 -1.698692 -2.079725 -0.103235  1.260371
2020-06-10 -1.049570 -1.506159  0.785892 -1.172984
2020-06-12  0.810853 -0.892856 -0.219564  1.100353
2020-06-13  0.632688 -0.845409 -0.093387 -0.592993
2020-06-14 -0.861506 -0.809814 -1.640137  0.595317
2020-06-11 -1.300102  0.862219  1.135647  0.775742

特定の軸方向への並べ替えは、sort_index()で取得できます。
ascending引数が、Falseの場合は降順、Trueで昇順になります。

特例の列を基準にした並べ替えは、sort_value()で取得できます。

値の抽出

a = pd.date_range('20200609', periods=6)
print('a = ', a)

b = pd.DataFrame(
    np.random.randn(6, 4), 
    index = a, 
    columns = list('ABCD')
) 
print('b = ', b) 

print("b['A'] = ", b['A'])
print('b[0:3] = ', b[0:3])
print("b['20200610': '20200612'] = ", b['20200610': '20200612'])
出力
a =  DatetimeIndex(['2020-06-09', '2020-06-10', '2020-06-11', '2020-06-12',
               '2020-06-13', '2020-06-14'],
              dtype='datetime64[ns]', freq='D')
b =                     A         B         C         D
2020-06-09 -0.232707 -0.734070 -0.304779 -0.636281
2020-06-10  2.044733 -0.783059 -0.298028  0.471809
2020-06-11 -0.631950 -0.400935 -0.902282 -0.249025
2020-06-12  2.198876  0.607541 -0.011687 -0.478565
2020-06-13  1.062989 -0.515174  0.260090 -0.596904
2020-06-14 -0.285998  1.158252  0.198043 -1.618806
b['A'] =  2020-06-09   -0.232707
2020-06-10    2.044733
2020-06-11   -0.631950
2020-06-12    2.198876
2020-06-13    1.062989
2020-06-14   -0.285998
Freq: D, Name: A, dtype: float64
b[0:3] =                     A         B         C         D
2020-06-09 -0.232707 -0.734070 -0.304779 -0.636281
2020-06-10  2.044733 -0.783059 -0.298028  0.471809
2020-06-11 -0.631950 -0.400935 -0.902282 -0.249025
b['20200610': '20200612'] =                     A         B         C         D
2020-06-10  2.044733 -0.783059 -0.298028  0.471809
2020-06-11 -0.631950 -0.400935 -0.902282 -0.249025
2020-06-12  2.198876  0.607541 -0.011687 -0.478565

ラベルの値で要素を抽出する

ラベルの値で要素を取得する場合は、locを使用します。

print("b.loc['20200613'] = ", b.loc['20200613'])
print("b.loc['20200613', 'A'] = ", b.loc['20200613', 'A'])
print("b.loc['20200613']['A'] = ", b.loc['20200613']['A'])
print("b.loc['20200613', ['A', 'B]] = ", b.loc['20200613', ['A', 'B']])
print("b.loc[:, ['A', 'B']] = ", b.loc[:, ['A', 'B']])
print("b.loc['20200611':'20200613', ['A', 'B']] = ", b.loc['20200611' : '20200613', ['A', 'B']])
print("b.at['20200613', 'A'] = ", b.at['20200613', 'A'])
出力
b.loc['20200613'] =  A    1.062989
B   -0.515174
C    0.260090
D   -0.596904
Name: 2020-06-13 00:00:00, dtype: float64

b.loc['20200613', 'A'] =  1.0629888632784765

b.loc['20200613']['A'] =  1.0629888632784765

b.loc['20200613', ['A', 'B]] =  A    1.062989
B   -0.515174
Name: 2020-06-13 00:00:00, dtype: float64

b.loc[:, ['A', 'B']] =                     A         B
2020-06-09 -0.232707 -0.734070
2020-06-10  2.044733 -0.783059
2020-06-11 -0.631950 -0.400935
2020-06-12  2.198876  0.607541
2020-06-13  1.062989 -0.515174
2020-06-14 -0.285998  1.158252

b.loc['20200611':'20200613', ['A', 'B']] =                     A         B
2020-06-11 -0.631950 -0.400935
2020-06-12  2.198876  0.607541
2020-06-13  1.062989 -0.515174

b.at['20200613', 'A'] =  1.0629888632784765

スカラー値を取得する場合(特定の1つの要素)、atを使うと処理が速くなります。

位置で要素を取得する

位置から要素を取得する場合は、ilocを使用します。

print("b.iloc[3] = ", b.iloc[3])
print("b.iloc[3:5, 0:2] = ", b.iloc[3:5, 0:2])
print("b.iloc[[1, 2, 4], [0, 2]] = ", b.iloc[[1, 2, 4], [0, 2]])
print("b.iloc[1:3, :] = ", b.iloc[1:3, :])
print("b.iloc[:, 1:3] = ", b.iloc[:, 1:3])
print("b.iloc[1, 1] = ", b.iloc[1, 1])
print("b.iat[1, 1] = ", b.iat[1, 1])
出力
b.iloc[3] =  A    2.198876
B    0.607541
C   -0.011687
D   -0.478565
Name: 2020-06-12 00:00:00, dtype: float64

b.iloc[3:5, 0:2] =                     A         B
2020-06-12  2.198876  0.607541
2020-06-13  1.062989 -0.515174

b.iloc[[1, 2, 4], [0, 2]] =                     A         C
2020-06-10  2.044733 -0.298028
2020-06-11 -0.631950 -0.902282
2020-06-13  1.062989  0.260090

b.iloc[1:3, :] =                     A         B         C         D
2020-06-10  2.044733 -0.783059 -0.298028  0.471809
2020-06-11 -0.631950 -0.400935 -0.902282 -0.249025

b.iloc[:, 1:3] =                     B         C
2020-06-09 -0.734070 -0.304779
2020-06-10 -0.783059 -0.298028
2020-06-11 -0.400935 -0.902282
2020-06-12  0.607541 -0.011687
2020-06-13 -0.515174  0.260090
2020-06-14  1.158252  0.198043

b.iloc[1, 1] =  -0.7830591937688992

b.iat[1, 1] =  -0.7830591937688992

スカラー値を取得する場合(特定の1つの要素)、iatを使うと処理が速くなります。

条件を指定して要素を取得する

print("b[b['A'] > 0] = ", b[b['A'] > 0])
print("b[b > 0] = ", b[b > 0])

b['E'] = ['one', 'one', 'two', 'three', 'four', 'three']
print('b = ', b)
print("b[b['E'].isin(['two', 'three'])] = ", b[b['E'].isin(['two', 'three'])])
出力
b[b['A'] > 0] =                     A         B         C         D
2020-06-10  2.044733 -0.783059 -0.298028  0.471809
2020-06-12  2.198876  0.607541 -0.011687 -0.478565
2020-06-13  1.062989 -0.515174  0.260090 -0.596904

b[b > 0] =                     A         B         C         D
2020-06-09       NaN       NaN       NaN       NaN
2020-06-10  2.044733       NaN       NaN  0.471809
2020-06-11       NaN       NaN       NaN       NaN
2020-06-12  2.198876  0.607541       NaN       NaN
2020-06-13  1.062989       NaN  0.260090       NaN
2020-06-14       NaN  1.158252  0.198043       NaN

b =                     A         B         C         D      E
2020-06-09 -0.232707 -0.734070 -0.304779 -0.636281    one
2020-06-10  2.044733 -0.783059 -0.298028  0.471809    one
2020-06-11 -0.631950 -0.400935 -0.902282 -0.249025    two
2020-06-12  2.198876  0.607541 -0.011687 -0.478565  three
2020-06-13  1.062989 -0.515174  0.260090 -0.596904   four
2020-06-14 -0.285998  1.158252  0.198043 -1.618806  three

b[b['E'].isin(['two', 'three'])] =                     A         B         C         D      E
2020-06-11 -0.631950 -0.400935 -0.902282 -0.249025    two
2020-06-12  2.198876  0.607541 -0.011687 -0.478565  three
2020-06-14 -0.285998  1.158252  0.198043 -1.618806  three

isin()で、特定の値を持つ要素を抽出できます。

要素を追加、設定する

a = pd.date_range('20200609', periods=6)
print('a = ', a)

b = pd.DataFrame(
    np.random.randn(6, 4), 
    index = a, 
    columns = list('ABCD')
) 
print('b = ', b) 

s1 = pd.Series(
    [1, 2, 3, 4, 5, 6],
    index=pd.date_range('20200609', periods=6)
)
print('s1 = ', s1)

# E列を追加します。
b['E'] = s1
print('b = ', b)

# ラベルの値で指定した要素に値を設定します。
b.at['20200609', 'A'] = 0
print('b = ', b)

# 位置で指定した要素に値を設定します。
b.iat[0, 1] = 0
print('b = ', b)

# D列にnumpyオブジェクトを設定します。
b.loc[:, 'D'] = np.array(
                            [5] * len(b)
                        )
print('b = ', b)

# 0より大きい要素の値をマイナスにします。
b[b > 0] = -b 
print('b = ', b)
出力
a =  DatetimeIndex(['2020-06-09', '2020-06-10', '2020-06-11', '2020-06-12',
               '2020-06-13', '2020-06-14'],
              dtype='datetime64[ns]', freq='D')

b =                     A         B         C         D
2020-06-09  0.199733  0.785209 -0.611686 -1.810060
2020-06-10  0.361514 -0.875324  0.926422 -0.587748
2020-06-11 -2.602176 -1.414534 -1.073530 -0.205837
2020-06-12 -1.457585  1.267296  0.102020  0.568383
2020-06-13  1.359036  1.101441  3.051888  0.146906
2020-06-14  0.118157  0.044420  0.874629 -1.698749

s1 =  2020-06-09    1
2020-06-10    2
2020-06-11    3
2020-06-12    4
2020-06-13    5
2020-06-14    6
Freq: D, dtype: int64

b =                     A         B         C         D  E
2020-06-09  0.199733  0.785209 -0.611686 -1.810060  1
2020-06-10  0.361514 -0.875324  0.926422 -0.587748  2
2020-06-11 -2.602176 -1.414534 -1.073530 -0.205837  3
2020-06-12 -1.457585  1.267296  0.102020  0.568383  4
2020-06-13  1.359036  1.101441  3.051888  0.146906  5
2020-06-14  0.118157  0.044420  0.874629 -1.698749  6

b =                     A         B         C         D  E
2020-06-09  0.000000  0.785209 -0.611686 -1.810060  1
2020-06-10  0.361514 -0.875324  0.926422 -0.587748  2
2020-06-11 -2.602176 -1.414534 -1.073530 -0.205837  3
2020-06-12 -1.457585  1.267296  0.102020  0.568383  4
2020-06-13  1.359036  1.101441  3.051888  0.146906  5
2020-06-14  0.118157  0.044420  0.874629 -1.698749  6

b =                     A         B         C         D  E
2020-06-09  0.000000  0.000000 -0.611686 -1.810060  1
2020-06-10  0.361514 -0.875324  0.926422 -0.587748  2
2020-06-11 -2.602176 -1.414534 -1.073530 -0.205837  3
2020-06-12 -1.457585  1.267296  0.102020  0.568383  4
2020-06-13  1.359036  1.101441  3.051888  0.146906  5
2020-06-14  0.118157  0.044420  0.874629 -1.698749  6

b =                     A         B         C  D  E
2020-06-09  0.000000  0.000000 -0.611686  5  1
2020-06-10  0.361514 -0.875324  0.926422  5  2
2020-06-11 -2.602176 -1.414534 -1.073530  5  3
2020-06-12 -1.457585  1.267296  0.102020  5  4
2020-06-13  1.359036  1.101441  3.051888  5  5
2020-06-14  0.118157  0.044420  0.874629  5  6

b =                     A         B         C  D  E
2020-06-09  0.000000  0.000000 -0.611686 -5 -1
2020-06-10 -0.361514 -0.875324 -0.926422 -5 -2
2020-06-11 -2.602176 -1.414534 -1.073530 -5 -3
2020-06-12 -1.457585 -1.267296 -0.102020 -5 -4
2020-06-13 -1.359036 -1.101441 -3.051888 -5 -5
2020-06-14 -0.118157 -0.044420 -0.874629 -5 -6

欠落した要素

欠落した要素、つまり、値が指定されていない要素を扱う方法を見てみます。

a = pd.date_range('20200609', periods=6)
print('a = ', a)

b = pd.DataFrame(
    np.random.randn(6, 4), 
    index = a, 
    columns = list('ABCD')
) 
print('b = ', b) 

s1 = pd.Series(
    [1, 2, 3, 4, 5, 6],
    index=pd.date_range('20200610', periods=6)
)
print('s1 = ', s1)

b['E'] = s1
print('b = ', b)

c = b.reindex(
    index=a[0:4],
    columns = list(b.columns) + ['F']
)
c.loc['20200609':'20200611', 'F'] = 1
print('c = ', c)

print(c.dropna(how='any'))
print(c.fillna(value=5))
print(pd.isna(c))

※E列の要素は、インデックスの日付がbオブジェクトと一つずれていることに注意してください。

出力
a =  DatetimeIndex(['2020-06-09', '2020-06-10', '2020-06-11', '2020-06-12',
               '2020-06-13', '2020-06-14'],
              dtype='datetime64[ns]', freq='D')

b =                     A         B         C         D
2020-06-09 -0.975228 -0.841940 -0.871876  0.265753
2020-06-10 -0.276629 -1.263136  1.010993  1.422562
2020-06-11  0.600269  0.560677  1.177760  1.404408
2020-06-12  0.779037  1.041018 -0.052188 -2.650628
2020-06-13 -0.411858  2.517579 -0.821479  0.086033
2020-06-14 -2.162505  0.036031 -1.077481  1.033002

s1 =  2020-06-10    1
2020-06-11    2
2020-06-12    3
2020-06-13    4
2020-06-14    5
2020-06-15    6
Freq: D, dtype: int64

b =                     A         B         C         D    E
2020-06-09 -0.975228 -0.841940 -0.871876  0.265753  NaN
2020-06-10 -0.276629 -1.263136  1.010993  1.422562  1.0
2020-06-11  0.600269  0.560677  1.177760  1.404408  2.0
2020-06-12  0.779037  1.041018 -0.052188 -2.650628  3.0
2020-06-13 -0.411858  2.517579 -0.821479  0.086033  4.0
2020-06-14 -2.162505  0.036031 -1.077481  1.033002  5.0

c =                     A         B         C         D    E    F
2020-06-09 -0.975228 -0.841940 -0.871876  0.265753  NaN  1.0
2020-06-10 -0.276629 -1.263136  1.010993  1.422562  1.0  1.0
2020-06-11  0.600269  0.560677  1.177760  1.404408  2.0  1.0
2020-06-12  0.779037  1.041018 -0.052188 -2.650628  3.0  NaN

                   A         B         C         D    E    F
2020-06-10 -0.276629 -1.263136  1.010993  1.422562  1.0  1.0
2020-06-11  0.600269  0.560677  1.177760  1.404408  2.0  1.0

                   A         B         C         D    E    F
2020-06-09 -0.975228 -0.841940 -0.871876  0.265753  5.0  1.0
2020-06-10 -0.276629 -1.263136  1.010993  1.422562  1.0  1.0
2020-06-11  0.600269  0.560677  1.177760  1.404408  2.0  1.0
2020-06-12  0.779037  1.041018 -0.052188 -2.650628  3.0  5.0

                A      B      C      D      E      F
2020-06-09  False  False  False  False   True  False
2020-06-10  False  False  False  False  False  False
2020-06-11  False  False  False  False  False  False
2020-06-12  False  False  False  False  False   True

dropna()で、NaNを含む行を削除しています。
fillna()で、NaN要素に値を設定しています。
pd.isna()で、NaNか否かをBoolean値で返しています。

今回は、ここまでにして次回10分Pandasの後半部分を見ていきます。

コメント

タイトルとURLをコピーしました