2023.04.10
Time Series 機械学習のためのPython必須ライブラリ、Pandas 2編
2.2 Time Series 機械学習のためのPython必須ライブラリ、Pandas 2編
2.2.3 要素選択、索引付け
2.2.3.1 series索引付け
索引付けは、 [位置]または[‘索引名‘]で索引付けできます。
import pandas as pd
import numpy as np
series_data = [2,4,6,8]
series_data = pd.Series(series_data)
series_data
0 2
1 4
2 6
3 8
dtype: int64
In [7]:
series_data[1]
4
*複数値の索引付けとスライス
一度に複数の値にインデックスを付けるときは、位置とインデックス名の両方が対になる値をすべて返します。
このとき、それぞれのインデックス位置を知りたい場合や、複数の値にインデックスを付けるときは、かっこをもう1つ付ける必要があります。
series_data[[0,2]]
0 2
2 6
dtype: int64
コロン(‘:’)で行う場合には同様にスライシングが可能である。
series_data[:3]
Out [10]:
0 2
1 4
2 6
dtype: int64
2.2.3.2 Dataframe索引付け
1つの列を取得する方法は、データフレームでは2つあります。 代表的には dataframe 変数名 [‘列名’] (このとき 1 つの列を持ってきた結果は series 形), または, dataframe 変数名. 列名である。
Dataframeの場合、スライスするときの現在の方法では、最も基本的なインデックスに関するスライスだけが可能です。 行列の列に関する情報は、コロンを介したスライスにはインポートできません。
In [11]:
df = pd.DataFrame([[14,'남'],[17,'여'],[24,'남'],[20,'여'],[15,'남'],[21,'여']],
index = ['a','b','c','d','e','f'],
columns = [「年齢」、「性別」])
In [12]:
df
Out [13]:
나이 성별
a 14 남
b 17 여
c 24 남
d 20 여
e 15 남
f 21 여
In [14]:
df[1:]
Out [15]:
나이 성별 성인
b 17 여 False
c 24 남 True
d 20 여 False
e 15 남 False
f 21 여 True
2.2.4 データ索引付け、スライシング loc, iloc, at, iat
Dataframeを使うようになったときに最もよく使われる関数だ。 データの前処理をしたり、インデックス付けやスライシングに常に使用されるからだ。.
2.2.4.1 loc
Index名でrowの情報を抽出するときに使用される。
そのため、df.loc[‘a’]と言ったとき、dfのindexで‘a’という名前のデータを探して情報を抽出する。 さらにDataframe型で抽出したい場合はdf.loc[:, [‘col_name’]]とすればよい。
2.2.4.2 iloc
インデックス番号で行の情報を抽出するときに使用されます。
loc、ilocの違いを見てみましょう。
In [16]:
df
Out [17]:
年齢 性別 大人
a 14 남 False
b 17 여 False
c 24 남 True
d 20 여 False
e 15 남 False
f 21 여 True
In [18]:
df['年齢']
Out [19]:
a 14
b 17
c 24
d 20
e 15
f 21
Name: 나이, dtype: int64
In [20]:
df.loc['a']
Out [21]:
年齢 14
性別 M
大人 False
Name: a, dtype: object
In [22]:
df.iloc[0]
Out [23]:
年齢 14
性別 M
大人 False
Name: a, dtype: object
2.2.4.3 ファースト索引付け(at, iat)
処理速度は at と iat の場合が loc, iloc よりはるかに速いのは、理由は 1 つの要素値を選択するようになっているからだ。
大容量データを処理するときは、ファストインデックスを使用することをお勧めします。 at、iatの違いは、上記のようにインデックス名にしたり、インデックスを直接入れる形で同じである。
In [24]:
df.at['a','나이']
Out [25]:
14
In [26]:
df.iat[0,0]
Out [27]:
14
長所と短所があるので、状況に合わせて試してみることをお勧めします.
2.2.5 算術演算
Pandasの場合、算術演算は内部的に3段階のプロセスを経ます。
1.行/列インデックスに基づいてすべての要素をソートします。
2. 同じ位置にある元素同士で一対一で対応させる。
3. 一対一対応となる元素同士の演算を処理する。 このとき元素がなければNaNで処理することになる。
dataframeで見たときはcolumns間の演算は series演算である。
series間の演算は同じインデックスを持つ元素同士演算して新しい seriesを返す。 また、四則演算演算子も可能です。 (-、*、/、%)
In [20]:
df = pd.DataFrame(np.arange(12).reshape(3,4), columns = ['a','b','c', 'd'])
In [28]:
df
Out [29]:
a b c d
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
In [30]:
df['b'] + df['c']
Out [31]:
0 3
1 11
2 19
dtype: int32
2.2.5.1 Series 数値演算
Series と数値演算は series の個々の要素にそれぞれ演算して新しい series を返します。
In [32]:
df['d'] + 10
Out [33]:
0 13
1 17
2 21
Name: d, dtype: int32
2.2.5.2 欠測値(NaN)
Series 間の計算を行う際に一つのインデックスでもない場合、NaNが出力される。
In [32]:
df_2 = (pd.DataFrame(np.arange(9).reshape(3,3), columns = ['a','b','c']))
In [32]:
df + df_2
Out [33]:
a b c d
0 0 2 4 NaN
1 7 9 11 NaN
2 14 16 18 NaN
2.5.5.3 演算メソッド
四則演算を直接してくれることもあり、軟関数も別に提供して可能である。 そしてNaNになる場合は、 fill_value オプションで値を置き換えることができる.
In [34]:
df.add(df_2, fill_value =0)
Out [35]:
a b c d
0 0 2 4 3.0
1 7 9 11 7.0
2 14 16 18 11.0
In [36]:
df.sub(df_2['a'], axis='index')
Out [37]:
a b c d
0 0 1 2 3
1 1 2 3 4
2 2 3 4 5
その他のメソッド算術演算に関連する関数
df.add(num), | Dataframeに スカラー値を加算する |
df.sub(num) | Dataframeにスカラー値を減算する |
df.mul(num), | Dataframeにスカラー値を掛ける |
df.div(num) | Dataframeにスカラー値を分割する |
df.pow(num) | Dataframeエスカラー値 n乗 |
.
2.2.6関数マッピング
Numpyなど、個々の要素を特定の関数に1対1に対応できます。 (ufunc)そのため、自分で作成した関数やlambdaを適用できるので、for文や基本関数で処理するよりもはるかに効率的です。
apply() – > series個々の要素に関数を適用するときに使用され、データフレームでも可能です。
In [38]:
def add_10(n):
return n + 10
In [39]:
df
Out [40]:
a b c d
0 0 1 2 3
1 4 5 6 7
2 8 9 10 11
In [41]:
df.apply(add_10)
Out [42]:
a b c d
0 10 11 12 13
1 14 15 16 17
2 18 19 20 21
マッピング関数も series か dataframe かによって可能かどうかが異なる。 場合を考えずに関数を作って使うとすれば apply が一番無難だ。
2.2.7 照合
ソートは、必要なデータ値を取得したい場合は必ず必要です。 このとき、ソートは大きくcolumn、rowの2つの型をインデックスに基づいてソートすることができる。
2.2.7.1 Sort_index()
最も基本的なRowのインデックスに基づいてソートする方法だ。
In [43]:
df = pd.DataFrame([[11,21],[14,24],[12,22],[13,23],[10,20],[15,25]], index=[1,4,2,6,3,0], columns=['b','a'])
In [44]:
df
Out [45]:
b a
1 11 21
4 14 24
2 12 22
6 13 23
3 10 20
0 15 25
In [46]:
df.sort_index(ascending=False)
Out [47]:
b a
6 13 23
4 14 24
3 10 20
2 12 22
1 11 21
0 15 25
列に基づいて並べ替える
同様に、axisで軸を変更することでcolumns間でも整列が可能です。
In [48]:
df.sort_index(axis=1)
Out [49]:
a b
1 21 11
4 24 14
2 22 12
6 23 13
3 20 10
0 25 15
値に基づいてソートする
Byオプションでソートすることができます。 つまり、基準となる列インデックスを入力しなければならず、2つを入力するようになれば、前にcolumn基準でソートをするようになり、次に来るcolumnをソートすることになる。
In [50]:
df.sort_values(by=['a','b'])
Out [51]:
b a
3 10 20
1 11 21
2 12 22
6 13 23
4 14 24
0 15 25
2.2.8 重複インデックスの確認と処理
普段扱うデータの場合、複数のファイルを一度に取り込んで合わせると、インデックスが重なる場合がある。 このような場合、索引付けをする際に重複するインデックスがあると、結果が変わる可能性があるため、重複処理をするのが良いと考えられる。 is_uniqueで簡単にインデックスの重複確認が可能です。
In [52]:
series = pd.Series(range(10), index=['a','b','c','c','d','e','e','f','g','i'])
In [53]:
series
Out [54]:
a 0
b 1
c 2
c 3
d 4
e 5
e 6
f 7
g 8
i 9
dtype: int64
In [55]:
series.index.is_unique
Out [56]:
False
唯一の値になっている場合
In [57]:
series_2 = pd.Series(range(3), index=['a','b','c'])
In [58]:
series_2.index.is_unique
Out [59]:
True
Dataframeの場合もindexとcolumnsを選択するときも同様.
In [60]:
df = pd.DataFrame(np.arange(36).reshape(6,6), index=[1,2,2,3,3,4], columns=['a','a','b','b','c','c'])
In [61]:
df
Out [62]:
a a b b c c
1 0 1 2 3 4 5
2 6 7 8 9 10 11
2 12 13 14 15 16 17
3 18 19 20 21 22 23
3 24 25 26 27 28 29
4 30 31 32 33 34 35
In [63]:
df['b']
Out [64]:
b b
1 2 3
2 8 9
2 14 15
3 20 21
3 26 27
4 32 33
In [65]:
df.loc[3,'b']
Out [66]:
b b
3 20 21
3 26 27
一次元 series に含まれた情報を抽出する unique() という関数も存在する。 そして、もし順序と唯一の値が必要なく、頻度数を確認したいなら、 value_counts() を使って確認が可能だ。
In [67]:
series = pd.Series(['a','b','c','c','d','e','e','f','g','i'])
In [68]:
series.unique()
Out [69]:
array(['a', 'b', 'c', 'd', 'e', 'f', 'g', 'i'], dtype=object)
In [70]:
series.value_counts()
Out [71]:
c 2
e 2
b 1
i 1
g 1
d 1
f 1
a 1
dtype: int64
追加のメソッド
df.isin([num..]) | Seriesのそれぞれの要素が存在するか boolean に返す |
df[‘col_name’].Unique() | seriesで重複する値を削除し、唯一の値のみを含む配列を返す |
df.[‘col_name’].Value_counts() | sereisで唯一の値のインデックス付けと数を数える. |
2.2.9 技術統計の計算と要約
それぞれの結果を見るための関数はいくつかありますが、全体的に見ることができる関数 df.describe() を活用してみましょう。
In [72]:
df = pd.DataFrame(np.arange(36).reshape(6,6), index=[1,2,3,4,5,6], columns=['a','b','c','d','e','f'])
In [73]:
df.describe()
Out [74]:
a b c d e f
count 6.000000 6.000000 6.000000 6.000000 6.000000 6.000000
mean 15.000000 16.000000 17.000000 18.000000 19.000000 20.000000
std 11.224972 11.224972 11.224972 11.224972 11.224972 11.224972
min 0.000000 1.000000 2.000000 3.000000 4.000000 5.000000
25% 7.500000 8.500000 9.500000 10.500000 11.500000 12.500000
50% 15.000000 16.000000 17.000000 18.000000 19.000000 20.000000
75% 22.500000 23.500000 24.500000 25.500000 26.500000 27.500000
max 30.000000 31.000000 32.000000 33.000000 34.000000 35.000000
統計関連メソッド
df.count() | 行/列のNan以外の値の数を返す |
df.min(), df.max() | 行/列の最大最小値を返す |
df.argmin(), df.argmax() | 行/列の最大最小値のインデックスを返す |
df.idxmin(), df.idxmax() | 行/列の最大最小値を持つインデックスの値を返す |
df.sum() | 和戻り |
df.mean() | 平均戻り |
df.median() | 中間値(50%分位)を返す |
df.mad() | 平均値から平均絶対偏差を計算する |
df.prod() | すべての値の積 |
df.std() | 標準偏差の値の計算 |
df.var() | サンプル分散の値の計算 |
df.cumsum() | 累積を計算 |
df.summin(), df.cummax() | 累積最小値、最小値を計算する |
df.cumprod() | 累積積計算 |
今回のページでは、 dataframe をもう少し詳しく扱う方法を調べた。 次のページでは、データのロードと保存、欠損値処理、データフレーム処理のヒントなどを調べてみましょう。