【Python】Pandasのwhereを使う:データフレーム条件抽出の詳細ガイド

Pandasは、Pythonのデータ分析ライブラリの中でも特に優れた機能を持っていることで知られています。その中でも、データフレームの条件抽出は、非常に便利で強力な機能の一つです。

本記事では、Pandasのwhere関数を使った条件抽出の詳細な使い方を解説します。実際のデータを使って、具体的な例を交えながら解説していくので、初心者から上級者まで幅広く役立つ情報が得られると思います。

データフレームの条件抽出:データフレームから特定の条件を満たすデータを抽出する方法

データフレームは、表形式のデータを扱うためのデータ構造で、PythonのPandasライブラリで提供されます。データフレームを扱う上で、最もよく使われる機能の一つが条件抽出です。条件抽出とは、データフレームから特定の条件を満たすデータだけを抽出することです。

たとえば、ある店舗の売り上げデータがあるとします。このデータから、特定の商品の売り上げだけを抽出するには、条件抽出を行います。

import pandas as pd
# サンプルデータ
df = pd.DataFrame({
 "商品名": ["A", "B", "C", "D", "E", "F"],
 "売り上げ": [100, 200, 300, 400, 500, 600]
})
# 条件抽出
df_selected = df[df["商品名"]=="B"]
print(df_selected)

上記のコードでは、データフレームdfから、”商品名”が”B”である行だけを抽出しています。条件式”df[“商品名”]==”B””は、データフレームdfの”商品名”列の各要素が”B”かどうかを判定し、その結果がTrueの行だけを取り出すという意味です。

このように、Pandasの条件抽出は非常に柔軟で、様々な条件を組み合わせることができます。しかし、条件が複雑になると、コードが長くなったり、見にくくなったりすることがあります。その

Pandasのwhere関数の基本的な使い方:条件抽出の構文とオプション

Pandasのwhere関数を使うと、条件抽出をより簡潔かつ効率的に行うことができます。where関数は、条件がTrueの要素をそのまま、Falseの要素を別の値に置き換えることができます。また、条件を満たさない行や列を削除することもできます。

where関数の基本的な構文は以下の通りです。

df.where(cond, other=np.nan, inplace=False, axis=None, level=None, errors="raise", try_cast=False)
    • cond: 条件式を指定します。条件を満たす要素にはTrueが、そうでない要素にはFalseが返されます。
      • other: 条件を満たさない要素に置き換える値を指定します。デフォルトはnumpy.nanです。
      • inplace: 元のデータフレームを変更する場合にTrueに設定します。デフォルトはFalseで、元のデータフレームを変更しません。
      • axis: 行または列に沿って操作する場合に指定します。行の場合は0、列の場合は1を指定します。
      • level: マルチインデックスの場合に指定します。条件を満たすインデックスだけを操作します。
      • errors: 不正なデータが含まれる場合のエラー処理方法を指定します。”raise”、”ignore”、”coerce”のいずれかを指定できます。
      • try_cast: キャストを試みる場合にTrueに設定します。デフォルトはFalseです。

    以下の例では、where関数を使って、あるデータフレームから条件に合う要素だけを抽出しています。

    import pandas as pd
    import numpy as np
    # サンプルデータ
    df = pd.DataFrame({
     "商品名": ["A", "B", "C", "D", "E", "F"],
     "売り上げ": [100, 200, 300, 400, 500, 600]
    })
    # where関数を使った条件抽出
    df_selected = df.where(df["商品名"]=="B")
    print(df_selected)
    

    上記のコードでは、データフレームdfから、”商品名”が”B”である行だけを抽出しています。where関数は、条件式”df[“商品名”]==”B””を満たす要素にTrueを、それ以外の要素にはNaNを返します。

    ここで、”other”引数を指定することで、条件を満たさない要素に別の値を置き換えることもできます。以下の例では、”商品名”が”B”でない場合には、売り上げを0に置き換えています。

    import pandas as pd
    import numpy as np
    # サンプルデータ
    df = pd.DataFrame({
     "商品名": ["A", "B", "C", "D", "E", "F"],
     "売り上げ": [100, 200, 300, 400, 500, 600]
    })
    # where関数を使った条件抽出と置換
    df_selected = df.where(df["商品名"]=="B", other=0)
    print(df_selected)
    

    上記のコードでは、”商品名”が”B”でない場合には、”売り上げ”を0に置き換えています。

    また、”inplace”引数をTrueに設定することで、元のデータフレームを変更することもできます。

    where関数の主要なパラメータ:cond, other, inplace, axis, level, errors, try_cast

    ここでは、where関数の主要なパラメータについて詳しく解説します。

    cond

    “cond”は、条件式を指定するパラメータです。条件式は、データフレームの各要素に適用され、条件を満たす要素にはTrueが、そうでない要素にはFalseが返されます。

    以下の例では、”商品名”が”B”である場合にTrueを返す条件式を指定しています。

    import pandas as pd
    import numpy as np
    # サンプルデータ
    df = pd.DataFrame({
     "商品名": ["A", "B", "C", "D", "E", "F"],
     "売り上げ": [100, 200, 300, 400, 500, 600]
    })
    # where関数での条件指定
    df_selected = df.where(df["商品名"]=="B")
    print(df_selected)
    

    other

    “other”は、条件を満たさない要素に置き換える値を指定するパラメータです。デフォルトでは、条件を満たさない要素にはNaNが設定されます。

    以下の例では、”商品名”が”B”でない場合には、”売り上げ”を0に置き換えています。

    import pandas as pd
    import numpy as np
    # サンプルデータ
    df = pd.DataFrame({
     "商品名": ["A", "B", "C", "D", "E", "F"],
     "売り上げ": [100, 200, 300, 400, 500, 600]
    })
    # where関数での条件指定と置換
    df_selected = df.where(df["商品名"]=="B", other=0)
    print(df_selected)
    

    inplace

    “inplace”は、元のデータフレームを変更するかどうかを指定するパラメータです。デフォルトでは、元のデータフレームを変更しません。

    以下の例では、元のデータフレームを変更することで、条件を満たす要素だけが残るデータフレームを作成しています。

    import pandas as pd
    import numpy as np
    # サンプルデータ
    df = pd.DataFrame({
     "商品名": ["A", "B", "C", "D", "E", "F"],
     "売り上げ": [100, 200, 300, 400, 500, 600]
    })
    # where関数での条件指定と置換
    df.where(df["商品名"]=="B", inplace=True)
    print(df)
    

    axis

    “axis”は、行または列に沿って操作するかどうかを指定するパラメータです。行の場合は0、列の場合は1を指定します。

    以下の例では、”axis”を指定して、行に沿って条件抽出を行っています。

    import pandas as pd
    import numpy as np
    # サンプルデータ
    df = pd.DataFrame({
     "商品名": ["A", "B", "C", "D", "E", "F"],
     "売り上げ": [100, 200, 300, 400, 500, 600]
    })
    # 列に沿った条件抽出
    df_selected = df.where(df["売り上げ"]>300, axis=0)
    print(df_selected)
    

    level

    “level”は、マルチインデックスの場合に指定するパラメータです。条件を満たすインデックスだけを操作することができます。

    errors

    “errors”は、不正なデータが含まれる場合のエラー処理方法を指定するパラメータです。”raise”、”ignore”、”coerce”のいずれかを指定できます。

    • “raise”: 不正なデータが含まれる場合にエラーを発生させます。
    • “ignore”: 不正なデータが含まれていてもエラーを発生させず、処理を続行します。
    • “coerce”: 不正なデータをNaNに置き換えます。

    try_cast

    “try_cast”は、キャストを試みるかどうかを指定するパラメータです。デフォルトでは、キャストを試みません。

    実践例:具体的なデータフレームでPandasのwhereを使った条件抽出を行う方法

    ここでは、具体的なデータフレームを使って、Pandasのwhere関数を使った条件抽出を行う方法について説明します。

    以下の例では、ある会社の従業員データが含まれるデータフレームから、30歳以上の従業員だけを抽出しています。

    import pandas as pd
    # サンプルデータ
    df = pd.DataFrame({
     "名前": ["山田", "田中", "佐藤", "鈴木", "高橋"],
     "年齢": [28, 32, 45, 21, 39],
     "部署": ["営業", "経理", "人事", "開発", "営業"]
    })
    # where関数を使った条件抽出
    df_selected = df.where(df["年齢"]>=30)
    print(df_selected)
    

    上記のコードでは、”年齢”が30以上の従業員だけを抽出しています。where関数を使うことで、1行のコードで条件抽出を行うことができます。

    whereとquery、maskの違い:類似の関数との違いと適切な使い分け

    Pandasには、where関数の他にも、query関数やmask関数など、条件抽出を行うための関数があります。ここでは、それぞれの違いと適切な使い分けについて解説します。

    query関数

    query関数は、条件式を文字列で指定することができます。そのため、複雑な条件式を簡潔に記述することができます。

    以下の例では、query関数を使って、あるデータフレームから”売り上げ”が300以上の行だけを抽出しています。

    import pandas as pd
    # サンプルデータ
    df = pd.DataFrame({
     "商品名": ["A", "B", "C", "D", "E", "F"],
     "売り上げ": [100, 200, 300, 400, 500, 600]
    })
    # query関数を使った条件抽出
    df_selected = df.query("売り上げ>=300")
    print(df_selected)
    

    query関数は、条件式を文字列で指定することができるため、簡潔なコードで条件抽出を行うことができます。ただし、文字列で指定するため、Pythonの文法に慣れていない人にとっては使いにくいかもしれません。

    mask関数

    mask関数は、where関数と似たような機能を持っていますが、条件を満たさない要素に値を置換するのではなく、条件を満たす要素に値を置換します。

    以下の例では、mask関数を使って、あるデータフレームの”売り上げ”が300未満の行だけを0に置き換えています。

    import pandas as pd
    # サンプルデータ
    df = pd.DataFrame({
     "商品名": ["A", "B", "C", "D", "E", "F"],
     "売り上げ": [100, 200, 300, 400, 500, 600]
    })
    # mask関数を使った条件抽出と置換
    df_selected = df.mask(df["売り上げ"]<300, other=0)
    print(df_selected)
    

    mask関数は、条件を満たす要素に値を置換するため、where関数と違って、”other”引数を使って置換する値を指定する必要があります。

    適切な使い分け

    where関数、query関数、mask関数は、条件抽出を行うための便利な関数ですが、適切な使い分けが必要です。

    • where関数:条件を満たす要素を残す場合に使います。
    • query関数:複雑な条件式を簡潔に記述する場合に使います。
    • mask関数:条件を満たす要素に値を置換する場合に使います。

    基本的には、where関数を使えば十分ですが、条件式が複雑な場合や、条件を満たす要素に値を置換する場合は、適切な関数を選んで使い分けるようにしましょう。

    まとめ

    Pandasのwhere関数を使うことで、データフレームから特定の条件を満たすデータを抽出することができます。where関数の基本的な使い方、主要なパラメータ、具体的な例、類似の関数との違いについて解説しました。適切に使い分けることで、データの前処理や分析を効率的に行うことができます。また、Pythonの文法に慣れていない人でも、簡単に条件抽出を行うことができるため、初心者にもおすすめの関数です。