- データサイエンス100本ノックをやりきる会を作りました🎉
- こちらのSlack招待URLからご参加ください!!
- ぜひ一緒に励まし合いながら、データサイエンス100本ノックをやり切りたいと思っています!
##Youtube
動画解説もしています。
##問題
P-006: レシート明細データフレーム「df_receipt」から売上日(sales_ymd)、顧客ID(customer_id)、商品コード(product_cd)、売上数量(quantity)、売上金額(amount)の順に列を指定し、以下の条件を満たすデータを抽出せよ。
- 顧客ID(customer_id)が"CS018205000001"
- 売上金額(amount)が1,000以上または売上数量(quantity)が5以上
##解答
df_receipt[['sales_ymd', 'customer_id', 'product_cd', 'quantity', 'amount']] \
.query('customer_id == "CS018205000001" & (amount >= 1000 or quantity >=5)')
##出力
sales_ymd | customer_id | product_cd | quantity | amount | |
---|---|---|---|---|---|
36 | 20180911 | CS018205000001 | P071401012 | 1 | 2200 |
9843 | 20180414 | CS018205000001 | P060104007 | 6 | 600 |
21110 | 20170614 | CS018205000001 | P050206001 | 5 | 990 |
68117 | 20190226 | CS018205000001 | P071401020 | 1 | 2200 |
72254 | 20180911 | CS018205000001 | P071401005 | 1 | 1100 |
##解説
・PandasのDataFrame/Seriesにて、列を指定しつつ、指定した行のうち、複数の条件に当てはまる行を確認する方法です。
・列情報を絞り、かつ、行を指定して、かつ、複数の条件に当てはまる情報を確認したい時に使用します。
・or条件は、「|」パイプライン(vertical bar)を用いて表現します。
・**'<データ名>[['<列名A>','<列名B>','<列名C>']].guery('<列名A> == "<行情報A>" & <列名B> >= 1000 | 列名C >= 5')'**で、指定した列(列名A,列名B,列名C)のうち、「列名A が指定した 行情報A に該当する行で、かつ、列名B が1000以上」、あるいは、「列名A が指定した 行情報A に該当する行で、かつ、列名C が5以上」の行を表示します。
※ちなみに、以下のコードのように「|」を「or」にしても、同じ結果になります。
df_receipt[['sales_ymd', 'customer_id', 'product_cd', 'quantity', 'amount']] \
.query('customer_id == "CS018205000001" & (amount >= 1000 or quantity >=5)')