Python、機械学習

【Python】リストの中から、条件に合致する値のインデックスを返すnp.where()。とても便利。

np.where()という関数をご存知でしょうか?

リストの中から、条件に合致する値のインデックスを返すものです。とても便利です。

例を見ながら、その有用っぷりを紹介します。

np.where()の使い方

三世代の家族があったとして、各メンバーの年齢をリストにしたものをall_member_ageとします。

import numpy as np

all_members_age = np.array([67, 70, 42, 41, 37, 12, 11, 6])

 

13歳未満のこどもが配列の何番目にいるかを知りたいとします。

children_index = np.where(all_members_age < 13)
children_index

(array([5, 6, 7]),)

13歳未満のこどもの位置をちゃんと抽出できました。ただ、np.where()はタプル型で返ってくるため、次のようにします。

children_index = children_index[0]
children_index

array([5, 6, 7])

次のようにこどものインデックスを入れてやれば、こどもだけの年齢を抽出することができます。

members_age[children_index]

array([12, 11, 6])

DataFrameでの前処理にも使える

次のようなdataframeがあったとします。

df =pd.DataFrame(
[[103, 42, 57, 81, 12, 0, 32], 
[20, 83, 57, 67, 109, 0, 4], 
[54, 82, 57, 21, 86, 0, 39]], 
index=['sample1', 'sample2', 'sample3'], 
columns = ['propertyA', 'propretyB', 'propertyC', 'propertyD', 
'propertyE', 'propertyF', 'propertyG']
)

df

分散がゼロ(つまり全て同じ値)のカラムを消去する

このうち、分散がゼロ(つまり全て同じ値)のカラムを消去したいとします。

zero_var_column_number = np.where(df.var(axis=0) == 0)
zero_var_column_number

(array([2, 5]),)

分散がゼロになるカラムの位置(2と5、つまりpropertyCとpropertyF)をちゃんと抽出できました。

では、分散がゼロになるカラムを消去します。

一旦タプルの状態を解消してから、

zero_var_column_number = zero_var_column_number[0]

 

カラムを消去します。

df1 = df.drop(df.columns[zero_var_column_number], axis=1)

df1

うまく消去できました。

同じ要領で、もし100より大きい数値を含むカラムの番号を選びたい場合はこうやって書きます。

over_hundred_column_number = np.where(df.max(axis=0) > 100)
over_hundred_column_number

(array([0, 4]),)