データ分析をしていると、「特定の条件に合ったデータだけを変換したい」という場面に出くわすことがよくありますよね。例えば、スコアが一定以上のデータだけを他の値に置き換えたいとか、特定の条件を満たすデータだけをマスクしたいといったケースです。Pandasには、こうした操作を簡単に行うための便利なメソッドとして、whereとmaskが用意されています。この記事では、Pandasのwhereとmaskメソッドを使った条件に応じたデータの変換方法について紹介します!
whereメソッドの使い方
Pandasのwhereメソッドは、指定した条件を満たす要素をそのままに、条件を満たさない要素を他の値に置き換えるために使います。言い換えると、「条件がTrueなら元の値を残し、Falseなら別の値に置き換える」という操作を簡単に行うことができるんです。
基本的なwhereの使い方
whereメソッドの基本的な使い方を見てみましょう。ここでは、スコアが80以上のデータをそのままに、それ未満のデータをNaNに置き換える例を示します。
1 2 3 4 5 6 |
import pandas as pd #サンプルデータの作成 data = {'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Eve'], 'Score': [85, 76, 90, 65, 88]} df = pd.DataFrame(data) df |
Scoreが80以上ならそのまま、未満ならNaNに置き換える
1 2 |
df['Score_filtered'] = df['Score'].where(df['Score'] >= 80) df |

このコードでは、Scoreが80以上のデータはそのままに、80未満のデータがNaNに置き換えられます。これにより、条件を満たすデータだけを抽出しやすくなりますね。
条件を満たさない要素を特定の値に置き換える
条件を満たさない要素をNaNではなく、特定の値に置き換えたい場合もありますよね。whereメソッドの第二引数に置き換えたい値を指定することで、これが可能になります。
1 2 3 |
# Scoreが80以上ならそのまま、未満なら0に置き換える df['Score_adjusted'] = df['Score'].where(df['Score'] >= 80, 0) df |

このコードでは、80未満のスコアが0に置き換えられています。特定の値に一括で置き換えたいときに便利です。
maskメソッドの使い方
maskメソッドは、whereメソッドの逆の動きをするものだと思ってください。つまり、maskは「条件がTrueなら置き換え、Falseなら元の値をそのままにする」という操作を行います。これにより、特定の条件を満たすデータだけを簡単にマスクしたり、変換したりすることができます。
基本的なmaskの使い方
まずは、基本的なmaskの使い方を見てみましょう。ここでは、スコアが80未満のデータだけをNaNに置き換える例を紹介します。
1 2 3 |
# Scoreが80未満ならNaNに置き換え、それ以外はそのまま df['Score_masked'] = df['Score'].mask(df['Score'] < 80) df |

このコードでは、Scoreが80未満のデータがNaNに置き換えられています。これにより、特定の条件に合うデータだけをマスクできるようになりますね。
条件を満たす要素を特定の値に置き換える
maskメソッドでも、条件を満たす要素を特定の値に置き換えることができます。これも、第二引数に置き換えたい値を指定することで可能です。
1 2 3 |
# Scoreが80未満なら0に置き換え、それ以外はそのまま df['Score_replaced'] = df['Score'].mask(df['Score'] < 80, 0) df |
このコードでは、80未満のスコアが0に置き換えられています。条件に合ったデータを特定の値で一括して処理したいときに役立ちます。
whereとmaskの使いどころ
whereとmaskはそれぞれ異なる状況で役立ちます。
where: 条件を満たす要素をそのままにし、満たさない要素を置き換える場合に使用します。例えば、「特定の条件に合わないデータをフィルタリングしたい」場合に便利です。
mask: 条件を満たす要素を置き換え、満たさない要素をそのままにする場合に使用します。例えば、「特定の条件に合うデータを目立たせたり、マスクしたい」場合に適しています。
複数条件を使った応用例
whereやmaskは、複数の条件を組み合わせることもできます。例えば、「スコアが80以上ならそのまま、50未満なら0に、それ以外は50にする」といった複雑な変換も可能です。
1 2 3 |
#複数の条件を使った変換 df['Score_complex'] = df['Score'].where(df['Score'] >= 80, 50).mask(df['Score'] < 50, 0) df |

このコードでは、80以上のスコアはそのまま、50未満のスコアは0に、50以上80未満のスコアは50に変換されています。複雑な条件でも、whereとmaskを組み合わせることで柔軟に対応できます。
======================================================
さらにデータサイエンスを学んでいきたいという方向けに「Pythonによるデータサイエンス」動画を提供しています。
基礎編・応用編それぞれ35時間以上の動画となっており、今なら50%OFFですので、ぜひチェックしてみてください!
>>>Pythonによるデータサイエンス基礎編
>>>Pythonによるデータサイエンス応用編