NumPyの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]),)