[pandas] 10 Minutes to pandas (和訳)_Part01

Posted on 2019/05/12 in programming , Updated on: 2019/05/12

はじめに

Pandas でよく使うコマンドなどショートチュートリアルが公式には用意されている。 公式

インポート

import pandas as pd
import numpy as np

オブジェクトの作成

要素のリストを渡すことで、Seriesを生成する。この際、デフォルトで整数のインデックス(行名)が渡される。

s = pd.Series([1,3,5,np.nan,6,8])
s
# 0    1.0
# 1    3.0
# 2    5.0
# 3    NaN
# 4    6.0
# 5    8.0
# dtype: float64

同様にDataFrameを numpy array を渡すことで生成する。 datetime型(日付型)をインデックスとして指定し、カラム(列名)も任意に指定する。

dates = pd.date_range('20190512', periods=6)
dates
# DatetimeIndex(['2019-05-12', '2019-05-13', '2019-05-14', '2019-05-15',
#                '2019-05-16', '2019-05-17'],
#               dtype='datetime64[ns]', freq='D')

df = pd.DataFrame(np.random.randn(6,4), index=dates,
                  columns=list('ABCD'))
df

#                       A          B            C           D
# 2019-05-12    0.005393    0.102458    -1.684039   0.708301
# 2019-05-13    0.380362    1.800157    0.266033    -1.434261
# 2019-05-14    0.577420    0.919558    1.292754    1.267979
# 2019-05-15    0.906858    -0.624234   -0.086394   1.968519
# 2019-05-16    0.233242    1.254417    0.374652    -1.110954
# 2019-05-17    -0.255095   0.185551    0.398101    1.068601

Series に変換できるオブジェクトの辞書を渡して、DataFrameを作成。

df2 = pd.DataFrame({'A': 1.,
                    'B': pd.Timestamp('20190512'),
                    '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'})

df2

#      A          B    C  D      E    F
# 0  1.0 2019-05-12  1.0  3   test  foo
# 1  1.0 2019-05-12  1.0  3  train  foo
# 2  1.0 2019-05-12  1.0  3   test  foo
# 3  1.0 2019-05-12  1.0  3  train  foo

結果のDataFrameのカラムは、異なる dtype を持つ。

df2.dtypes
# A           float64
# B    datetime64[ns]
# C           float32
# D             int32
# E          category
# F            object
# dtype: object

データの表示

DataFrameの先頭と最後を表示する。

df.head()
#                       A          B            C           D
# 2019-05-12    0.005393    0.102458    -1.684039   0.708301
# 2019-05-13    0.380362    1.800157    0.266033    -1.434261
# 2019-05-14    0.577420    0.919558    1.292754    1.267979
# 2019-05-15    0.906858    -0.624234   -0.086394   1.968519
# 2019-05-16    0.233242    1.254417    0.374652    -1.110954

df.tail(3)
# 2019-05-15    0.906858    -0.624234   -0.086394   1.968519
# 2019-05-16    0.233242    1.254417    0.374652    -1.110954
# 2019-05-17    -0.255095   0.185551    0.398101    1.068601

インデックスと、カラムを表示する。

df.index
# DatetimeIndex(['2019-05-12', '2019-05-13', '2019-05-14', '2019-05-15',
#                '2019-05-16', '2019-05-17'],
#               dtype='datetime64[ns]', freq='D')

df.columns
# Index(['A', 'B', 'C', 'D'], dtype='object')

DataFrame.to_numpy() は、2次元の numpy 配列を返す。DataFrameに異なる データ型のカラムがある場合、厄介なことになる可能性がある。 pandas と numpy のキホ天気な違いとして、numpy array は配列全体に対して1つの dtype を持つのに対し、pandas のDataFrameはカラムごとに1つの dtype を持つ。
DataFrame.to_numpy() を用いると、pandas はDataFrame内のすべての dtype を 保持できる numpy dtype を探す。これは最終的にオブジェクトになる可能性があり、 そのためには、python オブジェクトに当てはめる必要がある。
※ DataFrame.to_numpy()は、インデックとカラム名を出力しない。

df.to_numpy()
# array([[ 0.00539334,  0.10245778, -1.68403869,  0.70830082],
#        [ 0.38036174,  1.8001566 ,  0.26603284, -1.43426062],
#        [ 0.57741957,  0.91955837,  1.29275444,  1.26797915],
#        [ 0.9068578 , -0.62423365, -0.08639419,  1.96851943],
#        [ 0.23324233,  1.25441696,  0.37465163, -1.11095442],
#        [-0.25509513,  0.18555078,  0.39810087,  1.06860126]])

df2.to_numpy()
# array([[1.0, Timestamp('2019-05-12 00:00:00'), 1.0, 3, 'test', 'foo'],
#        [1.0, Timestamp('2019-05-12 00:00:00'), 1.0, 3, 'train', 'foo'],
#        [1.0, Timestamp('2019-05-12 00:00:00'), 1.0, 3, 'test', 'foo'],
#        [1.0, Timestamp('2019-05-12 00:00:00'), 1.0, 3, 'train', 'foo']],
#       dtype=object)

describe() メソッドで、データの統計的なまとめを素早く確認できる。

df.describe()
#               A           B          C            D
# count  6.000000    6.000000    6.000000    6.000000
# mean   0.308030    0.606318    0.093518    0.411364
# std    0.412478    0.881882    0.983037    1.371309
# min   -0.255095   -0.624234   -1.684039   -1.434261
# 25%    0.062356    0.123231    0.001713   -0.656141
# 50%    0.306802    0.552555    0.320342    0.888451
# 75%    0.528155    1.170702    0.392239    1.218135
# max    0.906858    1.800157    1.292754    1.968519

データフレームの転置

df.T
#   2019-05-12  2019-05-13  2019-05-14  2019-05-15  2019-05-16  2019-05-17   
#     00:00:00    00:00:00    00:00:00    00:00:00    00:00:00    00:00:00
# A   0.005393    0.380362    0.577420    0.906858    0.233242   -0.255095
# B   0.102458    1.800157    0.919558   -0.624234    1.254417    0.185551
# C  -1.684039    0.266033    1.292754   -0.086394    0.374652    0.398101
# D   0.708301   -1.434261    1.267979    1.968519   -1.110954    1.068601

軸に沿って並び替え。下記例では、axis=1(行方向)にそって列名を昇順で表示

df.sort_index(axis=1, ascending=False)
#               D           C           B           A
# 2019-05-12     0.708301   -1.684039    0.102458    0.005393
# 2019-05-13    -1.434261    0.266033    1.800157    0.380362
# 2019-05-14     1.267979    1.292754    0.919558    0.577420
# 2019-05-15   1.968519 -0.086394   -0.624234    0.906858
# 2019-05-16    -1.110954    0.374652    1.254417    0.233242
# 2019-05-17   1.068601  0.398101    0.185551   -0.255095

データの値で並び替え(列名を指定する)

df.sort_values(by='B')
#                       A           B           C           D
# 2019-05-15     0.906858   -0.624234   -0.086394    1.968519
# 2019-05-12     0.005393    0.102458   -1.684039    0.708301
# 2019-05-17    -0.255095    0.185551    0.398101    1.068601
# 2019-05-14     0.577420    0.919558    1.292754    1.267979
# 2019-05-16     0.233242    1.254417    0.374652   -1.110954
# 2019-05-13     0.380362    1.800157    0.266033   -1.434261