Site cover image

Site icon imageExcelおさるくんのastro-notion-blog

VBA / Python / Notion / AIによる業務効率化とデータサイエンスに関する情報を発信しています!

Post title icon【006 複数条件に合致する行を抽出する②】 Python in Excelで始めるデータサイエンス100本ノック!

Featured image of the post

データサイエンス100本ノック関連記事リスト

Post title icon in a page linkArrow icon of a page link【001 全項目を指定行数抽出する】 Python in Excelで始めるデータサイエンス100本ノック!

Post title icon in a page linkArrow icon of a page link【002 特定の列を抽出する】 Python in Excelで始めるデータサイエンス100本ノック!

Post title icon in a page linkArrow icon of a page link【003 指定列の列名を変更する】 Python in Excelで始めるデータサイエンス100本ノック!

Post title icon in a page linkArrow icon of a page link【004 特定条件に合致する行を抽出(=、>、<)】 Python in Excelで始めるデータサイエンス100本ノック!

Post title icon in a page linkArrow icon of a page link【005 複数条件に合致する行を抽出する①】 Python in Excelで始めるデータサイエンス100本ノック!

Post title icon in a page linkArrow icon of a page link【006 複数条件に合致する行を抽出する②】 Python in Excelで始めるデータサイエンス100本ノック!

Post title icon in a page linkArrow icon of a page link【007 複数条件に合致する行を抽出する③】 Python in Excelで始めるデータサイエンス100本ノック!

Post title icon in a page linkArrow icon of a page link【008 特定条件に合致しない行を抽出する(!=)】 Python in Excelで始めるデータサイエンス100本ノック!

1️⃣ はじめに

  • この連載企画では、データサイエンス100本ノックをPython in Excelで実行する方法を比較しながらご紹介しています。
    📖
    Python in Excelとは?
    Image in a image block
    Python in Excelは、Excel上で直接Pythonのコードを実行できる話題の新機能です。
    • 2023年8月に、パブリックプレビュー版が発表されました。
    • 現在は、Microsoftの一定のバージョン以降でMicrosoft 365 insidersプログラムに参加し「Beta Channel」を選択することで利用が可能です。
    • Python in Excelでは、ExcelにPython実行環境である「Anaconda」が組み込まれています。
    • 新しい関数である「PY」関数を使って、セルにPythonプログラムを書き込むと、クラウドでPythonプログラムを実行することができます。
    • Python向けの各種ライブラリとして、Pandas Matplotlibseaborn を使えば、データの整形やグラフ化ができたり、scikit-learn を使用すれば機械学習やデータからの予測などの機能を利用できます。

  • それでは早速、演習問題006 複数条件に合致する行を抽出する②にチャレンジしてみましょう!

2️⃣ データサイエンス100本ノックの紹介

3️⃣ Excelのワークシート関数で実行

  • レシート明細のCSVデータをExcelで開いています。
    Image in a image block

  • データのダウンロードの方法はこちらの動画をご覧ください。

  • まず、Excelのワークシート関数を使って実行していきます。
    Image in a image block

Icon in a callout block
演習問題006
  • レシート明細データ(df_receipt)から売上年月日(sales_ymd)、顧客ID(customer_id)、商品コード(product_cd)、売上数量(quantity)、売上金額(amount)の順に列を指定し、以下の全ての条件を満たすデータを抽出せよ。
    • 顧客ID(customer_id)が"CS018205000001"
    • 売上金額(amount)が1,000以上または売上数量(quantity)が5以上
Image in a image block

  • 条件式を考える場合はベン図で考えると分かりやすいです。
  • 今回のように条件が複雑な場合はいくつかの段階に分けて条件を組み立てていきます。 まず、「売上金額(amount)が1,000以上または売上数量(quantity)が5以上」の条件を組み立てます。
  • このような「AまたはB」の論理演算を論理和といいます。
    Image in a image block

  • 次に、組み立てた条件と「顧客ID(customer_id)が"CS018205000001"」との論理積を取ります。
    Image in a image block

  • 論理積については前回の動画でもご説明いたしましたのでご確認ください。

  • まずはFILTER関数を使用して条件に該当する行を抽出します。
    Icon in a callout block
    FILTER関数とは?

    FILTER関数は指定した条件に合致するデータを抽出し、結果を表形式で表示する関数です。スピルの機能により、抽出結果が複数のセルに展開されます。

    Image in a image block

  • FILTER関数で複数条件を指定する際は「*」と「+」を使用します。
    Image in a image block

  • *」は and 条件を表現します。
    Image in a image block

  • +」は or 条件を表現します。
    Image in a image block

  • 条件に該当する行を抽出できました。
    =FILTER(A:I,(F:F="CS018205000001")*((H:H>=5)+(I:I>=1000)))
    Image in a image block

  • 続いて、該当の列のみに絞り込みを行うためCHOOSECOLS関数を使用します。
    Icon in a callout block
    CHOOSECOLS関数とは?

    CHOOSECOLS関数は、配列やデータ範囲から特定の列を抽出するためのExcel関数です。抽出したい列番号を引数に指定して使用します。

    Image in a image block

  • CHOOSECOLS関数を使って「1,6,7,8,9」の列を指定して抽出することができました。
    =CHOOSECOLS(FILTER(A:I,(F:F="CS018205000001")*((H:H>=5)+(I:I>=1000))),1,6,7,8,9)
    Image in a image block

  • 最後にCHOOSECOLS関数を使って見出し行を抽出し、VSTACK関数を使用して見出し行とデータ行を結合させます。
    Icon in a callout block
    VSTACK関数とは?

    VSTACK関数は複数の配列を垂直方向に繋げる関数で、ヘッダー行とデータ行を結合させることが可能です。

    Image in a image block

  • 条件に該当するヘッダー行とデータ行を抽出できました。
    =VSTACK(CHOOSECOLS(A1:I1,1,6,7,8,9),CHOOSECOLS(FILTER(A:I,(F:F="CS018205000001")*((H:H>=5)+(I:I>=1000))),1,6,7,8,9))
    Image in a image block

【補足】

  • VSTACK関数とCHOOSECOLS関数の順番を入れ替えることで以下のように、より効率的に書き直すことができます。
    =CHOOSECOLS(VSTACK(A1:I1,FILTER(A:I,(F:F="CS018205000001")*((H:H>=5)+(I:I>=1000)))),1,6,7,8,9)

    VSTACK関数で先にヘッダーとデータを結合することで、CHOOSECOLS関数による列番号(1,6,7,8,9)の指定を1回で済むようにしています。

指定した条件でデータを絞り込み表示することができました。

次はPython in Excelで確認します。

4️⃣ Python in Excelで実行

  • レシート明細のCSVデータをExcelで開いています。
    Image in a image block

  • 数式タブからPythonの挿入を選択します。
    Image in a image block

  • Python in Excelを使ってDataFrameにデータを格納するにはセル範囲を選択します。
    Image in a image block

    列を指定するか、または表のセル範囲を指定します。

  • 指定した範囲をdf_receiptという変数に格納します。
    df_receipt = xl("A:I", headers=True)

  • df_receiptに対してリストで表示したい列名を入力します。
    df_receipt = xl("A:I", headers=True)
    df_receipt[['sales_ymd', 'customer_id', 'product_cd', 'quantity', 'amount']]
    Image in a image block

  • ここからPandasのqueryメソッドを使用してデータを絞り込みます。
  • queryメソッドを使用すると、データフレーム内のデータに対して、文字列ベースのクエリ式を使って条件を指定し、その条件に一致するデータのみを抽出することができます。
  • まず、「売上金額 (amount) が1,000以上または売上数量 (quantity) が5以上」の条件を組み立てます。
  • queryで論理和をとる場合は|(パイプ)を使用し、文字列で条件を指定します。
    df_receipt[['sales_ymd', 'customer_id', 'product_cd', 'quantity', 'amount']]. \
    	query('amount >= 1000 | quantity >= 5')
    Image in a image block

    Ctrl + Enterで実行します。

  • 表示がDataFrameに変わりましたら、数式バー隣のプルダウンメニューをクリック、PythonオブジェクトからExcelの値に変更します。
    Image in a image block

  • 「売上金額 (amount) が1,000以上または売上数量 (quantity) が5以上」の行が抽出できました。
    Image in a image block

  • 次に、この条件と「顧客ID (customer_id) が"CS018205000001"」との論理積を取ります。
  • この際、&(アンパサンド)は|(パイプ)よりも優先されてしまうため、|(パイプ)の条件式に丸括弧をつけます。
  • 条件式全体をシングルクォーテーションで囲み、検索する文字列をダブルクォーテーションで囲みます。
    df_receipt[['sales_ymd', 'customer_id', 'product_cd', 'quantity', 'amount']]. \
    	query('customer_id == "CS018205000001" & (amount >= 1000 | quantity >= 5)')
    Image in a image block

  • Ctrl + Enterで実行します。
    Image in a image block

  • 条件で絞り込みしたデータが出力されました。
    Image in a image block

  • なお、逆に条件式全体をダブルクォーテーションで囲み、検索文字列をシングルクォーテーションで囲むこともできます。
  • またqueryメソッドの場合は&(アンパサンド)をand|(パイプ)をorと記述することも可能です。
    df_receipt[['sales_ymd', 'customer_id', 'product_cd', 'quantity', 'amount']]. \
    	query("customer_id == 'CS018205000001' and (amount >= 1000 or quantity >= 5)")
    Image in a image block

  • Ctrl + Enterで実行します。
    Image in a image block

    条件で絞り込みしたデータが出力されました。

    以上で、データサイエンス100本ノック演習問題006 複数条件に合致する行を抽出する②をクリアしました。

5️⃣ おわりに

  • 最後までお読みいただきありがとうございます!
  • この記事へのご質問やアドバイスがありましたら、ぜひコメントもお待ちしております。
  • またXでもVBA、Pythonに関するアウトプットをしていますので、🔽フォローいただけますと幸いです😆