Site cover image

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

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

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

Featured image of the post

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

1️⃣ はじめに

  • この連載企画では、データサイエンス100本ノックをDockerと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 を使用すれば機械学習やデータからの予測などの機能を利用できます。

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

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

3️⃣ Docker上で実行

  • まず、Dockerコンテナ上で立ち上げたJupyter環境で実行していきます。
    Image in a image block

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

  • 条件式を考える場合はベン図で考えると分かりやすいです。
    Image in a image block

  • 今回の場合、「顧客ID(customer_id)がCS018205000001かつ売上金額(amount)が1,000以上」な条件を組み立てます。 このような「AかつB」の論理演算を論理積といいます。
  • なお、売上金額(amount)については1,000「以上」となっており、1,000の場合も含むことを意識して条件式を組み立てる必要があります。

  • 一番初めのセルでレシート明細データのCSVファイルをdf_receiptという変数に読み込む処理をしています。
    Image in a image block

  • 読み込んだ df_receiptから表示する列をリストで指定します。

    df_receiptに続けて角括弧を入力し、複数の列をリストで指定します。

    df_receipt[['sales_ymd', 'customer_id', 'product_cd', 'amount']]

  • 複数の列を指定してデータを出力できました。
    Image in a image block

  • 続いて、AかつBの論理演算を行います。

    Pandasの場合、データフレームの項目に対し、比較演算子による条件指定を行うことで、True/Falseの配列を生成することができます。

    df = df_receipt[['sales_ymd', 'customer_id', 'product_cd', 'amount']]
    (df['customer_id'] == 'CS018205000001') & (df['amount'] >= 1000)

    customer_idCS018205000001でかつ、amountが1000以上の行がTrueとなります。

  • 条件と一致した行のみTrueとなります。
    Image in a image block

  • 論理積を記述する際は(アンパサンド)で2つの条件式をつなげます。なお、andとするとエラーとなりますので注意が必要です。
    Image in a image block

  • そして、データフレームのdfの中で条件式を書くことで、Trueの項目でデータを絞り込むことができます。
    df = df_receipt[['sales_ymd', 'customer_id', 'product_cd', 'amount']]
    df[(df['customer_id'] == 'CS018205000001') & (df['amount'] >= 1000)]
    Image in a image block

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

    次は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', 'amount']]
    Image in a image block

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

  • 値が出力されました。
    Image in a image block

  • 続いてはPandasqueryメソッドを使用してデータを絞り込みます。
  • queryメソッドを使用すると、データフレーム内のデータに対して、文字列ベースのクエリ式を使って条件を指定し、その条件に一致するデータのみを抽出することができます。
  • 顧客ID(customer_id)と売上金額(amount)の値を文字列で指定します。条件式全体をシングルクォーテーションで囲み、検索する文字列をダブルクォーテーションで囲みます。
    df_receipt[['sales_ymd', 'customer_id', 'product_cd', 'amount']]. \
    	query('customer_id == "CS018205000001" & amount >= 1000')
    Image in a image block

    Ctrl + Enterで実行します。

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

  • なお、逆に条件式全体をダブルクォーテーションで囲み、検索文字列をシングルクォーテーションで囲むこともできます。

    また、queryメソッドの場合は&(アンパサンド)の他andと記述することも可能です。

    df_receipt[['sales_ymd', 'customer_id', 'product_cd', 'amount']]. \
    	query("customer_id == 'CS018205000001' and amount >= 1000")
    Image in a image block

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

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

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

5️⃣ おわりに

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