【Python】whereとmaskでpandas.dataframeへアクセス

whereとmaskとは?

データ分析の際に、データフレームをあつことが多いと思います。
データフレーム内に格納された値を判別し、別の値を格納したいことがあります。
つまり、whereとmaskを使うことでデータフレーム全体に対して置換処理が可能になります。

参考文献

Pythonによるデータ分析入門 第2版 ―NumPy、pandasを使ったデータ処理

Pythonによるデータ分析入門 第2版 ―NumPy、pandasを使ったデータ処理

事前準備

今回データフレームに対して処理を行うので、
事前にデータフレームを作成しておきましょう。

import pandas as pd

df = pd.DataFrame({'A': [1, 2, 3],
                    'B': [4, 5, 6],
                    'C': [7, 8, 9]})

このようなデータフレームが作成されました。

A B C
1 4 7
2 5 8
3 6 9

where

NaNへの置換

dataframe.where(dataframe 条件)といった書き方をします。
今回は、条件合致しなかった値をNaNに置換しましょう。
後ほど説明をしますが、where()に条件しか記載しない場合は、
条件が合致しなかった箇所をNaNで置き換えます。

df.where(df > 5)

実行結果

A B C
NaN NaN 7
NaN NaN 8
NaN 6 9

このように格納された値を参照し、
x > 5に合致しなかった値はNaNに置換されました。

特定の値へ変換

NaNではなく、特定の値へ変換して見ましょう。
書き方としては、whereの括弧内に情報を追加します。

dataframe.where(dataframe 条件, 置換する値)

条件に合致しない箇所を0に置換

df.where(df > 5, 0)

実行結果

A B C
0 0 7
0 0 8
0 6 9

このように特定の値へ変換することができました。

データフレーム同士の置換

例えば、縦横同じ長さのデータフレームが2つ存在したときに、
データフレームAの値を参照して、条件に合致しない場合は、データフレームBの値を格納する
といった処理を行いたい場合にもwhereを使うことができる。

# 2つめのデータフレーム作成

df2 = pd.DataFrame({'A': [10, 20, 30],
                    'B': [40, 50, 60],
                    'C': [70, 80, 90]})

作成されたテーブル

A B C
10 40 70
20 50 80
30 60 90

早速dfの値を参照して、条件が合致しない場合にdf2の値を置換してみましょう。

df.where(df > 5, df2)

実行結果

A B C
10 40 7
20 50 8
30 6 9

このように変換されました。
dfの値を参照し、x > 5の条件に合致しない値のみ、
df2の値が格納されました。

留意点
2つのデータフレームのカラム名が同じであること

whereはこのように条件に合致しない値に対して処理を行うことが可能です。

mask

whereは条件に合致しなかった値に対して処理を行いました。
一方で、maskは条件に合致した値のみ処理を行います。

NaNへの置換

dataframe.mask(dataframe 条件)といった記載方法です。
whereとほぼ同じですね。

先程作成したデータフレームを用いて、処理を行いましょう。

df.mask(df > 5)

実行結果

A B C
1 4 NaN
2 5 NaN
3 NaN NaN

whereのときとは逆の結果になりましたね。
maskはx > 5の条件に合致する箇所をNaNに置換しました。

特定の値へ変換

記載方法は、dataframe.mask(dataframe 条件, 置換する値)となります。

df.mask(df > 5, 0)

実行結果

A B C
1 4 0
2 5 0
3 0 0

whereと書き方は類似しております。
条件のあとに置換したい値を指定します。

データフレーム同士の置換

早速、サンプルコードをおみせします。

df.mask(df > 5, df2)

実行結果

A B C
1 4 70
2 5 80
3 60 90

このように、条件に合致した箇所の値が
df2の値に変換されております。

まとめ

whereは条件に合致しない値の処理
maskは条件に合致する値の処理

このように違いがありますので、混同しないように気をつけましょう。