データサイエンス100本ノック(構造化データ加工編)- Python Part 1 (Q1 to Q20)の解説です。
参照(Reference) : 「データサイエンティスト協会スキル定義委員」の「データサイエンス100本ノック(構造化データ加工編)」
The Data Scientist Society Github :
Data Science 100 Knocks (Structured Data Processing) URL :
はじめに
- 初めに以下のセルを実行してください
- 必要なライブラリのインポートとデータベース(PostgreSQL)からのデータ読み込みを行います
- pandas等、利用が想定されるライブラリは以下セルでインポートしています
- その他利用したいライブラリがあれば適宜インストールしてください(”!pip install ライブラリ名”でインストールも可能)
- 処理は複数回に分けても構いません
- 名前、住所等はダミーデータであり、実在するものではありません
import os
import pandas as pd
import numpy as np
from datetime import datetime, date
from dateutil.relativedelta import relativedelta
import math
import psycopg2
from sqlalchemy import create_engine
from sklearn import preprocessing
from sklearn.impute import SimpleImputer
from sklearn.model_selection import train_test_split
from sklearn.model_selection import TimeSeriesSplit
from imblearn.under_sampling import RandomUnderSampler
if 'PG_PORT' in os.environ:
pgconfig = {
'host': 'db',
'port': os.environ['PG_PORT'],
'database': os.environ['PG_DATABASE'],
'user': os.environ['PG_USER'],
'password': os.environ['PG_PASSWORD'],
}
# pd.read_sql用のコネクタ
conn = psycopg2.connect(**pgconfig)
df_customer = pd.read_sql(sql='select * from customer', con=conn)
df_category = pd.read_sql(sql='select * from category', con=conn)
df_product = pd.read_sql(sql='select * from product', con=conn)
df_receipt = pd.read_sql(sql='select * from receipt', con=conn)
df_store = pd.read_sql(sql='select * from store', con=conn)
df_geocode = pd.read_sql(sql='select * from geocode', con=conn)
else:
if not os.path.exists('../data/'):
!git clone https://github.com/The-Japan-DataScientist-Society/100knocks-preprocess
os.chdir('100knocks-preprocess/docker/work/answer')
dtype = {
'customer_id': str,
'gender_cd': str,
'postal_cd': str,
'application_store_cd': str,
'status_cd': str,
'category_major_cd': str,
'category_medium_cd': str,
'category_small_cd': str,
'product_cd': str,
'store_cd': str,
'prefecture_cd': str,
'tel_no': str,
'postal_cd': str,
'street': str
}
df_customer = pd.read_csv("../data/customer.csv", dtype=dtype)
df_category = pd.read_csv("../data/category.csv", dtype=dtype)
df_product = pd.read_csv("../data/product.csv", dtype=dtype)
df_receipt = pd.read_csv("../data/receipt.csv", dtype=dtype)
df_store = pd.read_csv("../data/store.csv", dtype=dtype)
df_geocode = pd.read_csv("../data/geocode.csv", dtype=dtype)
演習問題
P-001: レシート明細データ(df_receipt)から全項目の先頭10件を表示し、どのようなデータを保有しているか目視で確認せよ。
df_receipt.head(10)
sales_ymd | sales_epoch | store_cd | receipt_no | receipt_sub_no | customer_id | product_cd | quantity | amount | |
---|---|---|---|---|---|---|---|---|---|
0 | 20181103 | 1541203200 | S14006 | 112 | 1 | CS006214000001 | P070305012 | 1 | 158 |
1 | 20181118 | 1542499200 | S13008 | 1132 | 2 | CS008415000097 | P070701017 | 1 | 81 |
2 | 20170712 | 1499817600 | S14028 | 1102 | 1 | CS028414000014 | P060101005 | 1 | 170 |
3 | 20190205 | 1549324800 | S14042 | 1132 | 1 | ZZ000000000000 | P050301001 | 1 | 25 |
4 | 20180821 | 1534809600 | S14025 | 1102 | 2 | CS025415000050 | P060102007 | 1 | 90 |
5 | 20190605 | 1559692800 | S13003 | 1112 | 1 | CS003515000195 | P050102002 | 1 | 138 |
6 | 20181205 | 1543968000 | S14024 | 1102 | 2 | CS024514000042 | P080101005 | 1 | 30 |
7 | 20190922 | 1569110400 | S14040 | 1102 | 1 | CS040415000178 | P070501004 | 1 | 128 |
8 | 20170504 | 1493856000 | S13020 | 1112 | 2 | ZZ000000000000 | P071302010 | 1 | 770 |
9 | 20191010 | 1570665600 | S14027 | 1102 | 1 | CS027514000015 | P071101003 | 1 | 680 |
解説:
df_receipt.head(10) というコードは、df_receipt という Pandas の DataFrame の最初の 10 行を表示するために使用されています。
Pandasでは、DataFrameは、潜在的に異なるデータ型の列を持つ2次元ラベル付きデータ構造です。これは、スプレッドシートやSQLのテーブルに似ています。
Pandas の .head() メソッドは、DataFrame の最初の n 行を表示するために使用されます。デフォルトでは、最初の5行が表示されます。この場合、.head(10)は、DataFrameの最初の10行を表示するために使用されます。
P-002: レシート明細データ(df_receipt)から売上年月日(sales_ymd)、顧客ID(customer_id)、商品コード(product_cd)、売上金額(amount)の順に列を指定し、10件表示せよ。
df_receipt[['sales_ymd', 'customer_id', 'product_cd', 'amount']].head(10)
sales_ymd | customer_id | product_cd | amount | |
---|---|---|---|---|
0 | 20181103 | CS006214000001 | P070305012 | 158 |
1 | 20181118 | CS008415000097 | P070701017 | 81 |
2 | 20170712 | CS028414000014 | P060101005 | 170 |
3 | 20190205 | ZZ000000000000 | P050301001 | 25 |
4 | 20180821 | CS025415000050 | P060102007 | 90 |
5 | 20190605 | CS003515000195 | P050102002 | 138 |
6 | 20181205 | CS024514000042 | P080101005 | 30 |
7 | 20190922 | CS040415000178 | P070501004 | 128 |
8 | 20170504 | ZZ000000000000 | P071302010 | 770 |
9 | 20191010 | CS027514000015 | P071101003 | 680 |
解説:
df_receipt[['sales_ymd', 'customer_id', 'product_cd', 'amount']].head(10) というコードは、df_receipt という Pandas DataFrame のカラムのサブセットの最初の 10 行を表示するために使用されています。
df_receipt[['sales_ymd', 'customer_id', 'product_cd', 'amount']] というコードは、DataFrame df_receipt からカラムのサブセットを選択するために使用されます。具体的には、sales_ymd、customer_id、product_cd、amountという名前のカラムが選択されます。
結果として得られるDataFrameには、これらの選択されたカラムのみが含まれます。そして、.head(10)メソッドを使用して、このサブセットDataFrameの最初の10行を表示します。
P-003: レシート明細データ(df_receipt)から売上年月日(sales_ymd)、顧客ID(customer_id)、商品コード(product_cd)、売上金額(amount)の順に列を指定し、10件表示せよ。ただし、sales_ymdsales_dateに項目名を変更しながら抽出すること。
df_receipt[['sales_ymd', 'customer_id', 'product_cd', 'amount']]. \
rename(columns={'sales_ymd': 'sales_date'}).head(10)
sales_date | customer_id | product_cd | amount | |
---|---|---|---|---|
0 | 20181103 | CS006214000001 | P070305012 | 158 |
1 | 20181118 | CS008415000097 | P070701017 | 81 |
2 | 20170712 | CS028414000014 | P060101005 | 170 |
3 | 20190205 | ZZ000000000000 | P050301001 | 25 |
4 | 20180821 | CS025415000050 | P060102007 | 90 |
5 | 20190605 | CS003515000195 | P050102002 | 138 |
6 | 20181205 | CS024514000042 | P080101005 | 30 |
7 | 20190922 | CS040415000178 | P070501004 | 128 |
8 | 20170504 | ZZ000000000000 | P071302010 | 770 |
9 | 20191010 | CS027514000015 | P071101003 | 680 |
解説:
df_receipt[['sales_ymd', 'customer_id', 'product_cd', 'amount']].rename(columns={'sales_ymd': 'sales_date'}).head(10) というコードは、df_receiptというPandas DataFrameから列のサブセットを選択して、列の1つを名前変更し、結果のDataFrameの最初の10行を表示するのに、使われています。
df_receipt[['sales_ymd', 'customer_id', 'product_cd', 'amount']] というコードは、DataFrame df_receipt からカラムのサブセットを選択するために使用されます。具体的には、sales_ymd、customer_id、product_cd、amountという名前のカラムを選択します。
そして、.rename()メソッドを使用して、sales_ymdカラムをsales_dateにリネームしています。このメソッドは、リネームされたカラムを持つ新しいDataFrameを返します。引数 columns={'sales_ymd': 'sales_date'} は、古いカラム名と新しいカラム名をマッピングする辞書を指定します。
最後に、.head(10)メソッドを使用して、結果のDataFrameの最初の10行を表示します。
P-004: レシート明細データ(df_receipt)から売上日(sales_ymd)、顧客ID(customer_id)、商品コード(product_cd)、売上金額(amount)の順に列を指定し、以下の条件を満たすデータを抽出せよ。
- 顧客ID(customer_id)が”CS018205000001″
# コード例1(queryを使う場合)
df_receipt[['sales_ymd', 'customer_id', 'product_cd', 'amount']]. \
query('customer_id == "CS018205000001"')
sales_ymd | customer_id | product_cd | amount | |
---|---|---|---|---|
36 | 20180911 | CS018205000001 | P071401012 | 2200 |
9843 | 20180414 | CS018205000001 | P060104007 | 600 |
21110 | 20170614 | CS018205000001 | P050206001 | 990 |
27673 | 20170614 | CS018205000001 | P060702015 | 108 |
27840 | 20190216 | CS018205000001 | P071005024 | 102 |
28757 | 20180414 | CS018205000001 | P071101002 | 278 |
39256 | 20190226 | CS018205000001 | P070902035 | 168 |
58121 | 20190924 | CS018205000001 | P060805001 | 495 |
68117 | 20190226 | CS018205000001 | P071401020 | 2200 |
72254 | 20180911 | CS018205000001 | P071401005 | 1100 |
88508 | 20190216 | CS018205000001 | P040101002 | 218 |
91525 | 20190924 | CS018205000001 | P091503001 | 280 |
解説:
df_receipt[['sales_ymd', 'customer_id', 'product_cd', 'amount']].query('customer_id == "CS018205000001"') というコードは、df_receipt という Pandas DataFrame から customer_id 列が特定の値 (CS0182050001) と一致する行のサブセットを選択するために使用されています。
df_receipt[['sales_ymd', 'customer_id', 'product_cd', 'amount']] というコードは、DataFrame df_receipt からカラムのサブセットを選択するために使用されます。具体的には、sales_ymd、customer_id、product_cd、amount という名前のカラムを選択します。
次に、.query()メソッドを使用して、特定の条件に基づいて、DataFrameの行をフィルタリングしています。この場合、条件は customer_id 列が値 "CS018205000001" と等しいことです。最初の行の末尾にあるバックスラッシュ(⽊)は、読みやすくするためにコードを次の行に続けていることを表します。
結果として得られるDataFrameには、customer_idカラムが指定された値と一致する行のみが含まれます。
# コード例1(queryを使わない場合)
df = df_receipt[['sales_ymd', 'customer_id', 'product_cd', 'amount']]
df[df['customer_id'] == 'CS018205000001']
sales_ymd | customer_id | product_cd | amount | |
---|---|---|---|---|
36 | 20180911 | CS018205000001 | P071401012 | 2200 |
9843 | 20180414 | CS018205000001 | P060104007 | 600 |
21110 | 20170614 | CS018205000001 | P050206001 | 990 |
27673 | 20170614 | CS018205000001 | P060702015 | 108 |
27840 | 20190216 | CS018205000001 | P071005024 | 102 |
28757 | 20180414 | CS018205000001 | P071101002 | 278 |
39256 | 20190226 | CS018205000001 | P070902035 | 168 |
58121 | 20190924 | CS018205000001 | P060805001 | 495 |
68117 | 20190226 | CS018205000001 | P071401020 | 2200 |
72254 | 20180911 | CS018205000001 | P071401005 | 1100 |
88508 | 20190216 | CS018205000001 | P040101002 | 218 |
91525 | 20190924 | CS018205000001 | P091503001 | 280 |
解説:
df_receipt[['sales_ymd', 'customer_id', 'product_cd', 'amount']].query('customer_id == "CS018205000001"') というコードは、df_receipt という Pandas DataFrame から customer_id 列が特定の値 (CS0182050001) と一致する行のサブセットを選択するために使用されています。
df_receipt[['sales_ymd', 'customer_id', 'product_cd', 'amount']] というコードは、DataFrame df_receipt からカラムのサブセットを選択するために使用されます。具体的には、sales_ymd、customer_id、product_cd、amount という名前のカラムを選択します。
次に、.query()メソッドを使用して、特定の条件に基づいて、DataFrameの行をフィルタリングしています。この場合、条件は customer_id 列が値 "CS018205000001" と等しいことです。最初の行の末尾にあるバックスラッシュ(⽊)は、読みやすくするためにコードを次の行に続けていることを表します。
結果として得られるDataFrameには、customer_idカラムが指定された値と一致する行のみが含まれます。
P-005: レシート明細データ(df_receipt)から売上日(sales_ymd)、顧客ID(customer_id)、商品コード(product_cd)、売上金額(amount)の順に列を指定し、以下の全ての条件を満たすデータを抽出せよ。
- 顧客ID(customer_id)が”CS018205000001″
- 売上金額(amount)が1,000以上
df_receipt[['sales_ymd', 'customer_id', 'product_cd', 'amount']] \
.query('customer_id == "CS018205000001" & amount >= 1000')
sales_ymd | customer_id | product_cd | amount | |
---|---|---|---|---|
36 | 20180911 | CS018205000001 | P071401012 | 2200 |
68117 | 20190226 | CS018205000001 | P071401020 | 2200 |
72254 | 20180911 | CS018205000001 | P071401005 | 1100 |
解説:
コード df_receipt[['sales_ymd', 'customer_id', 'product_cd', 'amount']] です。\ .query('customer_id == "CS018205000001" & amount >= 1000') は、df_receipt という Pandas DataFrame から行のサブセットを選択するために使用され、ここで customer_id 列は特定の値 (CS018205000001) と同じ、amount 列は 1000 以上となります。
df_receipt[['sales_ymd', 'customer_id', 'product_cd', 'amount']] というコードは、DataFrame df_receipt から列のサブセットを選択するために使用されています。具体的には、sales_ymd、customer_id、product_cd、amount という名前のカラムを選択します。
次に、.query()メソッドを使用して、複数の条件に基づいてDataFrameの行をフィルタリングしています。記号 & は、2 つの条件間の論理 AND 演算を示すために使用されます。最初の条件は、customer_idカラムが値「CS018205000001」に等しいことです。2つ目の条件は、amountカラムが1000以上であることです。
結果として得られるDataFrameには、両方の条件が満たされた行のみが含まれます。
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 | 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 |
解説:
コード df_receipt[['sales_ymd', 'customer_id', 'product_cd', 'quantity', 'amount']]. query('customer_id == "CS018205000001" & (amount >= 1000 | quantity >=5)') は、df_receipt という Pandas DataFrame から行のサブセットを選択するために使われます。customer_id 列が特定の値 (CS018205000001) に等しく、umount 列が 1000 以上または quantity 列が 5 以上である。
df_receipt[['sales_ymd', 'customer_id', 'product_cd', 'quantity', 'amount']] というコードは、DataFrame df_receipt から列のサブセットを選択するために使用されるコードです。具体的には、sales_ymd、customer_id、product_cd、quantity、amount という名前のカラムを選択します。
次に、.query()メソッドを使用して、複数の条件に基づいてDataFrameの行をフィルタリングしています。記号 & は、2 つの条件間の論理 AND 演算を示すために使用されます。最初の条件は、customer_id列が値「CS018205000001」と等しいことです。2番目の条件は、括弧で囲まれ、論理OR演算を示す|記号で区切られた2つのサブ条件を含んでいます。最初のサブ条件は、金額列が1000以上であることである。2つ目のサブ条件は、quantity列が5以上であることである。
結果として得られるDataFrameには、customer_idが指定された値と等しく、かつamountが1000以上、quantityが5以上の行のみが含まれます。
P-007: レシート明細データ(df_receipt)から売上日(sales_ymd)、顧客ID(customer_id)、商品コード(product_cd)、売上金額(amount)の順に列を指定し、以下の全ての条件を満たすデータを抽出せよ。
- 顧客ID(customer_id)が”CS018205000001″
- 売上金額(amount)が1,000以上2,000以下
df_receipt[['sales_ymd', 'customer_id', 'product_cd', 'amount']] \
.query('customer_id == "CS018205000001" & 1000 <= amount <= 2000')
sales_ymd | customer_id | product_cd | amount | |
---|---|---|---|---|
72254 | 20180911 | CS018205000001 | P071401005 | 1100 |
解説:
コード df_receipt[['sales_ymd', 'customer_id', 'product_cd', 'amount']] です。\ .query('customer_id == "CS018205000001" & 1000 <= amount <= 2000') は、df_receipt という Pandas DataFrame から行のサブセットを選択するために使用され、ここで customer_id 列は特定の値 (CS018205000001) と同じで、 amount 列は 1000 から 2000 (inclusive) までとなっています。
df_receipt[['sales_ymd', 'customer_id', 'product_cd', 'amount']] というコードは、DataFrame df_receipt から列のサブセットを選択するために使用されます。具体的には、sales_ymd、customer_id、product_cd、amount という名前のカラムを選択します。
次に、.query()メソッドを使用して、複数の条件に基づいてDataFrameの行をフィルタリングしています。記号 & は、2 つの条件間の論理 AND 演算を示すために使用されます。最初の条件は、customer_id列が値「CS018205000001」に等しいことです。2つ目の条件は、比較演算子 <= と >= を使用して、amount 列の値の範囲を指定することです。
出来上がったDataFrameには、customer_idが指定された値と等しく、amountが1000から2000の間である行のみが含まれます(包括的な値)。
P-008: レシート明細データ(df_receipt)から売上日(sales_ymd)、顧客ID(customer_id)、商品コード(product_cd)、売上金額(amount)の順に列を指定し、以下の全ての条件を満たすデータを抽出せよ。
- 顧客ID(customer_id)が”CS018205000001″
- 商品コード(product_cd)が”P071401019″以外
df_receipt[['sales_ymd', 'customer_id', 'product_cd', 'amount']] \
.query('customer_id == "CS018205000001" & product_cd != "P071401019"')
sales_ymd | customer_id | product_cd | amount | |
---|---|---|---|---|
36 | 20180911 | CS018205000001 | P071401012 | 2200 |
9843 | 20180414 | CS018205000001 | P060104007 | 600 |
21110 | 20170614 | CS018205000001 | P050206001 | 990 |
27673 | 20170614 | CS018205000001 | P060702015 | 108 |
27840 | 20190216 | CS018205000001 | P071005024 | 102 |
28757 | 20180414 | CS018205000001 | P071101002 | 278 |
39256 | 20190226 | CS018205000001 | P070902035 | 168 |
58121 | 20190924 | CS018205000001 | P060805001 | 495 |
68117 | 20190226 | CS018205000001 | P071401020 | 2200 |
72254 | 20180911 | CS018205000001 | P071401005 | 1100 |
88508 | 20190216 | CS018205000001 | P040101002 | 218 |
91525 | 20190924 | CS018205000001 | P091503001 | 280 |
解説:
コード df_receipt[['sales_ymd', 'customer_id', 'product_cd', 'amount']] です。\ df_receipt['customer_id == "CS018205000001" & product_cd != "P071401019"] は、Pandas DataFrame の df_receipt から行のサブセットを選択するために使用され、ここで customer_id 列は特定の値 (CS018205000001) と同じで、product_cd 列は特定の値(P0714019)と同じではない。
コード df_receipt[['sales_ymd', 'customer_id', 'product_cd', 'amount']] は、DataFrame df_receipt から列のサブセットを選択するために使用します。具体的には、sales_ymd、customer_id、product_cd、amount という名前のカラムを選択します。
次に、.query()メソッドを使用して、複数の条件に基づいてDataFrameの行をフィルタリングしています。記号 & は、2 つの条件間の論理 AND 演算を示すために使用されます。最初の条件は、customer_id列が値「CS018205000001」に等しいことです。2つ目の条件は、product_cdカラムが値 "P071401019 "と等しくないことで、これは!=比較演算子を用いて実現されます。
結果として得られるDataFrameには、customer_idが指定された値と等しく、product_cdが指定された値と等しくない行のみが含まれます。
P-009: 以下の処理において、出力結果を変えずにORをANDに書き換えよ。
df_store.query('not(prefecture_cd == "13" | floor_area > 900)')
df_store.query('prefecture_cd != "13" & floor_area <= 900')
store_cd | store_name | prefecture_cd | prefecture | address | address_kana | tel_no | longitude | latitude | floor_area | |
---|---|---|---|---|---|---|---|---|---|---|
18 | S14046 | 北山田店 | 14 | 神奈川県 | 神奈川県横浜市都筑区北山田一丁目 | カナガワケンヨコハマシツヅキクキタヤマタイッチョウメ | 045-123-4049 | 139.5916 | 35.56189 | 831.0 |
20 | S14011 | 日吉本町店 | 14 | 神奈川県 | 神奈川県横浜市港北区日吉本町四丁目 | カナガワケンヨコハマシコウホククヒヨシホンチョウヨンチョウメ | 045-123-4033 | 139.6316 | 35.54655 | 890.0 |
38 | S12013 | 習志野店 | 12 | 千葉県 | 千葉県習志野市芝園一丁目 | チバケンナラシノシシバゾノイッチョウメ | 047-123-4002 | 140.0220 | 35.66122 | 808.0 |
解説:
df_store.query('prefecture_cd != "13" & floor_area <= 900') というコードは、df_store という Pandas DataFrame から prefecture_cd 列が特定の値 (13) と等しくない、かつ floor_area 列が特定の値 (900) 以下である行にフィルターをかけるために使用されています。
.query()メソッドは、ブール式に基づいてDataFrameの行をフィルタリングするために使用されます。この場合、ブール式は 'prefecture_cd != "13" & floor_area <= 900' です。
!=演算子は、prefecture_cd列の各値が値「13」と等しくないかどうかをチェックするために使用される。演算子&は、この条件と、floor_area列の値が900以下かどうかをチェックする2番目の条件との間の論理AND演算を示すために使用されています。
結果として得られるDataFrameには、両方の条件がTrueである行のみが含まれます。
P-010: 店舗データ(df_store)から、店舗コード(store_cd)が”S14″で始まるものだけ全項目抽出し、10件表示せよ。
df_store.query("store_cd.str.startswith('S14')", engine='python').head(10)
store_cd | store_name | prefecture_cd | prefecture | address | address_kana | tel_no | longitude | latitude | floor_area | |
---|---|---|---|---|---|---|---|---|---|---|
2 | S14010 | 菊名店 | 14 | 神奈川県 | 神奈川県横浜市港北区菊名一丁目 | カナガワケンヨコハマシコウホククキクナイッチョウメ | 045-123-4032 | 139.6326 | 35.50049 | 1732.0 |
3 | S14033 | 阿久和店 | 14 | 神奈川県 | 神奈川県横浜市瀬谷区阿久和西一丁目 | カナガワケンヨコハマシセヤクアクワニシイッチョウメ | 045-123-4043 | 139.4961 | 35.45918 | 1495.0 |
4 | S14036 | 相模原中央店 | 14 | 神奈川県 | 神奈川県相模原市中央二丁目 | カナガワケンサガミハラシチュウオウニチョウメ | 042-123-4045 | 139.3716 | 35.57327 | 1679.0 |
7 | S14040 | 長津田店 | 14 | 神奈川県 | 神奈川県横浜市緑区長津田みなみ台五丁目 | カナガワケンヨコハマシミドリクナガツタミナミダイゴチョウメ | 045-123-4046 | 139.4994 | 35.52398 | 1548.0 |
9 | S14050 | 阿久和西店 | 14 | 神奈川県 | 神奈川県横浜市瀬谷区阿久和西一丁目 | カナガワケンヨコハマシセヤクアクワニシイッチョウメ | 045-123-4053 | 139.4961 | 35.45918 | 1830.0 |
12 | S14028 | 二ツ橋店 | 14 | 神奈川県 | 神奈川県横浜市瀬谷区二ツ橋町 | カナガワケンヨコハマシセヤクフタツバシチョウ | 045-123-4042 | 139.4963 | 35.46304 | 1574.0 |
16 | S14012 | 本牧和田店 | 14 | 神奈川県 | 神奈川県横浜市中区本牧和田 | カナガワケンヨコハマシナカクホンモクワダ | 045-123-4034 | 139.6582 | 35.42156 | 1341.0 |
18 | S14046 | 北山田店 | 14 | 神奈川県 | 神奈川県横浜市都筑区北山田一丁目 | カナガワケンヨコハマシツヅキクキタヤマタイッチョウメ | 045-123-4049 | 139.5916 | 35.56189 | 831.0 |
19 | S14022 | 逗子店 | 14 | 神奈川県 | 神奈川県逗子市逗子一丁目 | カナガワケンズシシズシイッチョウメ | 046-123-4036 | 139.5789 | 35.29642 | 1838.0 |
20 | S14011 | 日吉本町店 | 14 | 神奈川県 | 神奈川県横浜市港北区日吉本町四丁目 | カナガワケンヨコハマシコウホククヒヨシホンチョウヨンチョウメ | 045-123-4033 | 139.6316 | 35.54655 | 890.0 |
解説:
df_store.query("store_cd.str.startswith('S14')", engine='python').head(10) というコードは、df_store という Pandas DataFrame から store_cd 列が特定の文字列 (S14) で始まっている行にフィルターをかけるために使用されています。
.query() メソッドは、DataFrame の行をブール式に基づいてフィルタリングするために使用されます。この場合、ブール式は「store_cd.str.startswith('S14')」となります。この式は、engineパラメータが「python」に設定されているため、Python構文で記述されています。この式は、store_cdカラムが文字列'S14'で始まるかどうかをチェックする。
str.startswith()メソッドは、Pythonの文字列メソッドで、文字列が指定された接頭辞で始まる場合にTrueを返すものです。この場合、str.startswith('S14')メソッドがstore_cdカラムの各要素に適用されます。
結果として得られるDataFrameには、store_cdカラムの先頭が文字列「S14」である行のみが含まれます。
.head(10) メソッドを使用して、結果のDataFrameの最初の10行のみを返します。
P-011: 顧客データ(df_customer)から顧客ID(customer_id)の末尾が1のものだけ全項目抽出し、10件表示せよ。
df_customer.query("customer_id.str.endswith('1')", engine='python').head(10)
customer_id | customer_name | gender_cd | gender | birth_day | age | postal_cd | address | application_store_cd | application_date | status_cd | |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | CS037613000071 | 六角 雅彦 | 9 | 不明 | 1952-04-01 | 66 | 136-0076 | 東京都江東区南砂********** | S13037 | 20150414 | 0-00000000-0 |
3 | CS028811000001 | 堀井 かおり | 1 | 女性 | 1933-03-27 | 86 | 245-0016 | 神奈川県横浜市泉区和泉町********** | S14028 | 20160115 | 0-00000000-0 |
14 | CS040412000191 | 川井 郁恵 | 1 | 女性 | 1977-01-05 | 42 | 226-0021 | 神奈川県横浜市緑区北八朔町********** | S14040 | 20151101 | 1-20091025-4 |
31 | CS028314000011 | 小菅 あおい | 1 | 女性 | 1983-11-26 | 35 | 246-0038 | 神奈川県横浜市瀬谷区宮沢********** | S14028 | 20151123 | 1-20080426-5 |
56 | CS039212000051 | 藤島 恵梨香 | 1 | 女性 | 1997-02-03 | 22 | 166-0001 | 東京都杉並区阿佐谷北********** | S13039 | 20171121 | 1-20100215-4 |
59 | CS015412000111 | 松居 奈月 | 1 | 女性 | 1972-10-04 | 46 | 136-0071 | 東京都江東区亀戸********** | S13015 | 20150629 | 0-00000000-0 |
63 | CS004702000041 | 野島 洋 | 0 | 男性 | 1943-08-24 | 75 | 176-0022 | 東京都練馬区向山********** | S13004 | 20170218 | 0-00000000-0 |
74 | CS041515000001 | 栗田 千夏 | 1 | 女性 | 1967-01-02 | 52 | 206-0001 | 東京都多摩市和田********** | S13041 | 20160422 | E-20100803-F |
85 | CS029313000221 | 北条 ひかり | 1 | 女性 | 1987-06-19 | 31 | 279-0011 | 千葉県浦安市美浜********** | S12029 | 20180810 | 0-00000000-0 |
102 | CS034312000071 | 望月 奈央 | 1 | 女性 | 1980-09-20 | 38 | 213-0026 | 神奈川県川崎市高津区久末********** | S14034 | 20160106 | 0-00000000-0 |
解説:
このコードは、df_customer という名前の Pandas DataFrame からデータのサブセットを選択しています。サブセットは、query()メソッドで指定された条件に基づいてフィルタリングされます。
条件は、query()メソッドの引数として渡される文字列「customer_id.str.endswith('1')」によって定義されています。この条件は、df_customer DataFrameの行のうち、customer_idカラムの末尾が文字'1'であるものだけを含むようにフィルタリングします。
engine='python' パラメータはオプションで、条件の評価に Python エンジンを使用することを指定します。query()メソッドのデフォルトエンジン(pandas.eval)がすべての文字列操作をサポートしているとは限らないため、条件に文字列操作が含まれる場合はこの指定が必要です。
最後に、head(10) メソッドを使用して、フィルタリングされた DataFrame の最初の 10 行を返します。これはオプションで、ここでは出力を管理しやすいサイズに制限するために使用されています。
P-012: 店舗データ(df_store)から、住所 (address) に”横浜市”が含まれるものだけ全項目表示せよ。
df_store.query("address.str.contains('横浜市')", engine='python')
store_cd | store_name | prefecture_cd | prefecture | address | address_kana | tel_no | longitude | latitude | floor_area | |
---|---|---|---|---|---|---|---|---|---|---|
2 | S14010 | 菊名店 | 14 | 神奈川県 | 神奈川県横浜市港北区菊名一丁目 | カナガワケンヨコハマシコウホククキクナイッチョウメ | 045-123-4032 | 139.6326 | 35.50049 | 1732.0 |
3 | S14033 | 阿久和店 | 14 | 神奈川県 | 神奈川県横浜市瀬谷区阿久和西一丁目 | カナガワケンヨコハマシセヤクアクワニシイッチョウメ | 045-123-4043 | 139.4961 | 35.45918 | 1495.0 |
7 | S14040 | 長津田店 | 14 | 神奈川県 | 神奈川県横浜市緑区長津田みなみ台五丁目 | カナガワケンヨコハマシミドリクナガツタミナミダイゴチョウメ | 045-123-4046 | 139.4994 | 35.52398 | 1548.0 |
9 | S14050 | 阿久和西店 | 14 | 神奈川県 | 神奈川県横浜市瀬谷区阿久和西一丁目 | カナガワケンヨコハマシセヤクアクワニシイッチョウメ | 045-123-4053 | 139.4961 | 35.45918 | 1830.0 |
12 | S14028 | 二ツ橋店 | 14 | 神奈川県 | 神奈川県横浜市瀬谷区二ツ橋町 | カナガワケンヨコハマシセヤクフタツバシチョウ | 045-123-4042 | 139.4963 | 35.46304 | 1574.0 |
16 | S14012 | 本牧和田店 | 14 | 神奈川県 | 神奈川県横浜市中区本牧和田 | カナガワケンヨコハマシナカクホンモクワダ | 045-123-4034 | 139.6582 | 35.42156 | 1341.0 |
18 | S14046 | 北山田店 | 14 | 神奈川県 | 神奈川県横浜市都筑区北山田一丁目 | カナガワケンヨコハマシツヅキクキタヤマタイッチョウメ | 045-123-4049 | 139.5916 | 35.56189 | 831.0 |
20 | S14011 | 日吉本町店 | 14 | 神奈川県 | 神奈川県横浜市港北区日吉本町四丁目 | カナガワケンヨコハマシコウホククヒヨシホンチョウヨンチョウメ | 045-123-4033 | 139.6316 | 35.54655 | 890.0 |
26 | S14048 | 中川中央店 | 14 | 神奈川県 | 神奈川県横浜市都筑区中川中央二丁目 | カナガワケンヨコハマシツヅキクナカガワチュウオウニチョウメ | 045-123-4051 | 139.5758 | 35.54912 | 1657.0 |
40 | S14042 | 新山下店 | 14 | 神奈川県 | 神奈川県横浜市中区新山下二丁目 | カナガワケンヨコハマシナカクシンヤマシタニチョウメ | 045-123-4047 | 139.6593 | 35.43894 | 1044.0 |
52 | S14006 | 葛が谷店 | 14 | 神奈川県 | 神奈川県横浜市都筑区葛が谷 | カナガワケンヨコハマシツヅキククズガヤ | 045-123-4031 | 139.5633 | 35.53573 | 1886.0 |
解説:
具体的には、query()の引数として渡される "address.str.contains('横浜市') "という文字列で条件を定義する。この文字列は、df_storeのaddressカラムに'横浜市'という部分文字列が含まれているかどうかをチェックするboolean式である。
str.contains()メソッドは、Pandasの文字列メソッドで、与えられた文字列列の各要素が指定された部分文字列を含むかどうかを示すブール型配列を返します。今回は、df_storeのaddressカラムに適用しています。
engine='python'引数は、フィルタリング処理をデフォルトのnumexprエンジンではなく、Pythonの組み込みeval()関数で実行することを指定する。これは、str.contains()など、numexprエンジンではサポートされていない特定のタイプの文字列操作をクエリー式で使用する場合に必要です。
P-013: 顧客データ(df_customer)から、ステータスコード(status_cd)の先頭がアルファベットのA〜Fで始まるデータを全項目抽出し、10件表示せよ。
df_customer.query("status_cd.str.contains(r'^[A-F]')",
engine='python').head(10)
customer_id | customer_name | gender_cd | gender | birth_day | age | postal_cd | address | application_store_cd | application_date | status_cd | |
---|---|---|---|---|---|---|---|---|---|---|---|
2 | CS031415000172 | 宇多田 貴美子 | 1 | 女性 | 1976-10-04 | 42 | 151-0053 | 東京都渋谷区代々木********** | S13031 | 20150529 | D-20100325-C |
6 | CS015414000103 | 奥野 陽子 | 1 | 女性 | 1977-08-09 | 41 | 136-0073 | 東京都江東区北砂********** | S13015 | 20150722 | B-20100609-B |
12 | CS011215000048 | 芦田 沙耶 | 1 | 女性 | 1992-02-01 | 27 | 223-0062 | 神奈川県横浜市港北区日吉本町********** | S14011 | 20150228 | C-20100421-9 |
15 | CS029415000023 | 梅田 里穂 | 1 | 女性 | 1976-01-17 | 43 | 279-0043 | 千葉県浦安市富士見********** | S12029 | 20150610 | D-20100918-E |
21 | CS035415000029 | 寺沢 真希 | 9 | 不明 | 1977-09-27 | 41 | 158-0096 | 東京都世田谷区玉川台********** | S13035 | 20141220 | F-20101029-F |
32 | CS031415000106 | 宇野 由美子 | 1 | 女性 | 1970-02-26 | 49 | 151-0053 | 東京都渋谷区代々木********** | S13031 | 20150201 | F-20100511-E |
33 | CS029215000025 | 石倉 美帆 | 1 | 女性 | 1993-09-28 | 25 | 279-0022 | 千葉県浦安市今川********** | S12029 | 20150708 | B-20100820-C |
40 | CS033605000005 | 猪股 雄太 | 0 | 男性 | 1955-12-05 | 63 | 246-0031 | 神奈川県横浜市瀬谷区瀬谷********** | S14033 | 20150425 | F-20100917-E |
44 | CS033415000229 | 板垣 菜々美 | 1 | 女性 | 1977-11-07 | 41 | 246-0021 | 神奈川県横浜市瀬谷区二ツ橋町********** | S14033 | 20150712 | F-20100326-E |
53 | CS008415000145 | 黒谷 麻緒 | 1 | 女性 | 1977-06-27 | 41 | 157-0067 | 東京都世田谷区喜多見********** | S13008 | 20150829 | F-20100622-F |
解説:
df_customer は DataFrame オブジェクトです。
.query() は、特定の条件に基づいて行をフィルタリングするために Pandas が提供するメソッドです。条件は、文字列の引数として指定されます。
この場合の条件は、「status_cd.str.contains(r'^[A-F]')」です。これは、str.contains()メソッドを使って、DataFrameのstatus_cdカラムにAからFまでの文字で始まる文字列が含まれているかどうかをチェックするものです(包括的)。正規表現パターン '^[A-F]' の前の r は生の文字列リテラルを示し、バックスラッシュ文字 (\) がエスケープ文字としてではなく、文字通り解釈されることを保証します。
engine='python'引数は、Pandasが使用するデフォルトのエンジンではなく、Pythonの組み込み正規表現エンジンを使用してフィルタリングを行うことを指定します。これは、デフォルトのエンジンが特定の正規表現機能をサポートしていなかったり、遅すぎたりする場合に有効である。
.head(10) メソッドは、フィルタリングされた DataFrame の最初の 10 行のみを返すために使用されています。
つまり、このコードは、全体として、status_cd列がAからFまでの文字で始まる行だけを含むようにdf_customer DataFrameをフィルタリングし、その結果のDataFrameの最初の10行を返しています。
P-014: 顧客データ(df_customer)から、ステータスコード(status_cd)の末尾が数字の1〜9で終わるデータを全項目抽出し、10件表示せよ。
# regexのオプションをつけることもできる(Falseにすれば正規表現ではなくそのままの文字列として扱われる)
df_customer.query("status_cd.str.contains(r'[1-9]$', regex=True)",
engine='python').head(10)
customer_id | customer_name | gender_cd | gender | birth_day | age | postal_cd | address | application_store_cd | application_date | status_cd | |
---|---|---|---|---|---|---|---|---|---|---|---|
4 | CS001215000145 | 田崎 美紀 | 1 | 女性 | 1995-03-29 | 24 | 144-0055 | 東京都大田区仲六郷********** | S13001 | 20170605 | 6-20090929-2 |
9 | CS033513000180 | 安斎 遥 | 1 | 女性 | 1962-07-11 | 56 | 241-0823 | 神奈川県横浜市旭区善部町********** | S14033 | 20150728 | 6-20080506-5 |
12 | CS011215000048 | 芦田 沙耶 | 1 | 女性 | 1992-02-01 | 27 | 223-0062 | 神奈川県横浜市港北区日吉本町********** | S14011 | 20150228 | C-20100421-9 |
14 | CS040412000191 | 川井 郁恵 | 1 | 女性 | 1977-01-05 | 42 | 226-0021 | 神奈川県横浜市緑区北八朔町********** | S14040 | 20151101 | 1-20091025-4 |
16 | CS009315000023 | 皆川 文世 | 1 | 女性 | 1980-04-15 | 38 | 154-0012 | 東京都世田谷区駒沢********** | S13009 | 20150319 | 5-20080322-1 |
22 | CS015315000033 | 福士 璃奈子 | 1 | 女性 | 1983-03-17 | 36 | 135-0043 | 東京都江東区塩浜********** | S13015 | 20141024 | 4-20080219-3 |
23 | CS023513000066 | 神戸 そら | 1 | 女性 | 1961-12-17 | 57 | 210-0005 | 神奈川県川崎市川崎区東田町********** | S14023 | 20150915 | 5-20100524-9 |
24 | CS035513000134 | 市川 美帆 | 1 | 女性 | 1960-03-27 | 59 | 156-0053 | 東京都世田谷区桜********** | S13035 | 20150227 | 8-20100711-9 |
27 | CS001515000263 | 高松 夏空 | 1 | 女性 | 1962-11-09 | 56 | 144-0051 | 東京都大田区西蒲田********** | S13001 | 20160812 | 1-20100804-1 |
28 | CS040314000027 | 鶴田 きみまろ | 9 | 不明 | 1986-03-26 | 33 | 226-0027 | 神奈川県横浜市緑区長津田********** | S14040 | 20150122 | 2-20080426-4 |
解説:
df_customer は DataFrame オブジェクトです。
.query() は、特定の条件に基づいて行をフィルタリングするために Pandas が提供するメソッドです。条件は、文字列の引数として指定されます。
この場合の条件は、「status_cd.str.contains(r'[1-9]$', regex=True)」となります。これは、str.contains()メソッドを使用して、DataFrameのstatus_cdカラムに1~9(含む)の数字で終わる文字列が含まれているかどうかをチェックします。文字$は文字列の終わりを表し、regex=True引数は、パターンが正規表現として解釈されることを示す。
engine='python'引数は、Pandasが使用するデフォルトのエンジンではなく、Pythonの組み込み正規表現エンジンを使用してフィルタリングを行うことを指定します。これは、デフォルトのエンジンが特定の正規表現機能をサポートしていなかったり、遅すぎたりするような場合に有効である。
.head(10)メソッドは、フィルタリングされたDataFrameの最初の10行のみを返すために使用されます。つまり、全体として、このコードは、status_cd列が1から9までの数字で終わる行のみを含むようにdf_customer DataFrameをフィルタリングし、結果としてDataFrameの最初の10行を返しています。
P-015: 顧客データ(df_customer)から、ステータスコード(status_cd)の先頭がアルファベットのA〜Fで始まり、末尾が数字の1〜9で終わるデータを全項目抽出し、10件表示せよ。
df_customer.query("status_cd.str.contains(r'^[A-F].*[1-9]$')",
engine='python').head(10)
customer_id | customer_name | gender_cd | gender | birth_day | age | postal_cd | address | application_store_cd | application_date | status_cd | |
---|---|---|---|---|---|---|---|---|---|---|---|
12 | CS011215000048 | 芦田 沙耶 | 1 | 女性 | 1992-02-01 | 27 | 223-0062 | 神奈川県横浜市港北区日吉本町********** | S14011 | 20150228 | C-20100421-9 |
68 | CS022513000105 | 島村 貴美子 | 1 | 女性 | 1962-03-12 | 57 | 249-0002 | 神奈川県逗子市山の根********** | S14022 | 20150320 | A-20091115-7 |
71 | CS001515000096 | 水野 陽子 | 9 | 不明 | 1960-11-29 | 58 | 144-0053 | 東京都大田区蒲田本町********** | S13001 | 20150614 | A-20100724-7 |
122 | CS013615000053 | 西脇 季衣 | 1 | 女性 | 1953-10-18 | 65 | 261-0026 | 千葉県千葉市美浜区幕張西********** | S12013 | 20150128 | B-20100329-6 |
144 | CS020412000161 | 小宮 薫 | 1 | 女性 | 1974-05-21 | 44 | 174-0042 | 東京都板橋区東坂下********** | S13020 | 20150822 | B-20081021-3 |
178 | CS001215000097 | 竹中 あさみ | 1 | 女性 | 1990-07-25 | 28 | 146-0095 | 東京都大田区多摩川********** | S13001 | 20170315 | A-20100211-2 |
252 | CS035212000007 | 内村 恵梨香 | 1 | 女性 | 1990-12-04 | 28 | 152-0023 | 東京都目黒区八雲********** | S13035 | 20151013 | B-20101018-6 |
259 | CS002515000386 | 野田 コウ | 1 | 女性 | 1963-05-30 | 55 | 185-0013 | 東京都国分寺市西恋ケ窪********** | S13002 | 20160410 | C-20100127-8 |
293 | CS001615000372 | 稲垣 寿々花 | 1 | 女性 | 1956-10-29 | 62 | 144-0035 | 東京都大田区南蒲田********** | S13001 | 20170403 | A-20100104-1 |
297 | CS032512000121 | 松井 知世 | 1 | 女性 | 1962-09-04 | 56 | 210-0011 | 神奈川県川崎市川崎区富士見********** | S13032 | 20150727 | A-20100103-5 |
解説:
このコードでは、PythonのPandasライブラリを使用して、df_customerという名前のDataFrameから行をフィルタリングしています。フィルタリングは、query()メソッドで指定された条件に基づいて行われ、このメソッドはブール式を表す文字列引数を取ります。
status_cd: df_customer DataFrameのカラムであると仮定する。
.: Pythonでオブジェクトのメソッドや属性にアクセスする際に使用されるドット表記です。
str: str:status_cdカラムの文字列メソッドを指します。
contains() : カラムの各要素に、与えられた部分文字列または正規表現が存在するかどうかをチェックする文字列メソッドです。
r'^[A-F].*[1-9]$': これは、文字AからF(含む)で始まり、1から9(含む)の数字で終わる文字列にマッチする正規表現パターンです。パターンの前の r 接頭辞は、それが生の文字列であることを示します。これは、バックスラッシュがエスケープ文字ではなく、リテラルバックスラッシュとして扱われることを意味します。
また、query()メソッドでは、engineの引数に'python'という値が指定されています。これは、Pandasが使用するデフォルトのエンジンがnumexprで、クエリの種類によっては高速に処理できますが、すべての種類の正規表現に対応していない場合があるからです。python'エンジンを使用することで、正規表現がPython regexモジュールで処理されるようになります。
最後に、.head(10) メソッドを呼び出すと、フィルタ条件に一致する最初の10行に出力が制限されます。
P-016: 店舗データ(df_store)から、電話番号(tel_no)が3桁-3桁-4桁のデータを全項目表示せよ。
df_store.query("tel_no.str.contains(r'^[0-9]{3}-[0-9]{3}-[0-9]{4}$')",
engine='python')
store_cd | store_name | prefecture_cd | prefecture | address | address_kana | tel_no | longitude | latitude | floor_area | |
---|---|---|---|---|---|---|---|---|---|---|
0 | S12014 | 千草台店 | 12 | 千葉県 | 千葉県千葉市稲毛区千草台一丁目 | チバケンチバシイナゲクチグサダイイッチョウメ | 043-123-4003 | 140.1180 | 35.63559 | 1698.0 |
1 | S13002 | 国分寺店 | 13 | 東京都 | 東京都国分寺市本多二丁目 | トウキョウトコクブンジシホンダニチョウメ | 042-123-4008 | 139.4802 | 35.70566 | 1735.0 |
2 | S14010 | 菊名店 | 14 | 神奈川県 | 神奈川県横浜市港北区菊名一丁目 | カナガワケンヨコハマシコウホククキクナイッチョウメ | 045-123-4032 | 139.6326 | 35.50049 | 1732.0 |
3 | S14033 | 阿久和店 | 14 | 神奈川県 | 神奈川県横浜市瀬谷区阿久和西一丁目 | カナガワケンヨコハマシセヤクアクワニシイッチョウメ | 045-123-4043 | 139.4961 | 35.45918 | 1495.0 |
4 | S14036 | 相模原中央店 | 14 | 神奈川県 | 神奈川県相模原市中央二丁目 | カナガワケンサガミハラシチュウオウニチョウメ | 042-123-4045 | 139.3716 | 35.57327 | 1679.0 |
7 | S14040 | 長津田店 | 14 | 神奈川県 | 神奈川県横浜市緑区長津田みなみ台五丁目 | カナガワケンヨコハマシミドリクナガツタミナミダイゴチョウメ | 045-123-4046 | 139.4994 | 35.52398 | 1548.0 |
9 | S14050 | 阿久和西店 | 14 | 神奈川県 | 神奈川県横浜市瀬谷区阿久和西一丁目 | カナガワケンヨコハマシセヤクアクワニシイッチョウメ | 045-123-4053 | 139.4961 | 35.45918 | 1830.0 |
11 | S13052 | 森野店 | 13 | 東京都 | 東京都町田市森野三丁目 | トウキョウトマチダシモリノサンチョウメ | 042-123-4030 | 139.4383 | 35.55293 | 1087.0 |
12 | S14028 | 二ツ橋店 | 14 | 神奈川県 | 神奈川県横浜市瀬谷区二ツ橋町 | カナガワケンヨコハマシセヤクフタツバシチョウ | 045-123-4042 | 139.4963 | 35.46304 | 1574.0 |
16 | S14012 | 本牧和田店 | 14 | 神奈川県 | 神奈川県横浜市中区本牧和田 | カナガワケンヨコハマシナカクホンモクワダ | 045-123-4034 | 139.6582 | 35.42156 | 1341.0 |
18 | S14046 | 北山田店 | 14 | 神奈川県 | 神奈川県横浜市都筑区北山田一丁目 | カナガワケンヨコハマシツヅキクキタヤマタイッチョウメ | 045-123-4049 | 139.5916 | 35.56189 | 831.0 |
19 | S14022 | 逗子店 | 14 | 神奈川県 | 神奈川県逗子市逗子一丁目 | カナガワケンズシシズシイッチョウメ | 046-123-4036 | 139.5789 | 35.29642 | 1838.0 |
20 | S14011 | 日吉本町店 | 14 | 神奈川県 | 神奈川県横浜市港北区日吉本町四丁目 | カナガワケンヨコハマシコウホククヒヨシホンチョウヨンチョウメ | 045-123-4033 | 139.6316 | 35.54655 | 890.0 |
21 | S13016 | 小金井店 | 13 | 東京都 | 東京都小金井市本町一丁目 | トウキョウトコガネイシホンチョウイッチョウメ | 042-123-4015 | 139.5094 | 35.70018 | 1399.0 |
22 | S14034 | 川崎野川店 | 14 | 神奈川県 | 神奈川県川崎市宮前区野川 | カナガワケンカワサキシミヤマエクノガワ | 044-123-4044 | 139.5998 | 35.57693 | 1318.0 |
26 | S14048 | 中川中央店 | 14 | 神奈川県 | 神奈川県横浜市都筑区中川中央二丁目 | カナガワケンヨコハマシツヅキクナカガワチュウオウニチョウメ | 045-123-4051 | 139.5758 | 35.54912 | 1657.0 |
27 | S12007 | 佐倉店 | 12 | 千葉県 | 千葉県佐倉市上志津 | チバケンサクラシカミシヅ | 043-123-4001 | 140.1452 | 35.71872 | 1895.0 |
28 | S14026 | 辻堂西海岸店 | 14 | 神奈川県 | 神奈川県藤沢市辻堂西海岸二丁目 | カナガワケンフジサワシツジドウニシカイガンニチョウメ | 046-123-4040 | 139.4466 | 35.32464 | 1732.0 |
29 | S13041 | 八王子店 | 13 | 東京都 | 東京都八王子市大塚 | トウキョウトハチオウジシオオツカ | 042-123-4026 | 139.4235 | 35.63787 | 810.0 |
31 | S14049 | 川崎大師店 | 14 | 神奈川県 | 神奈川県川崎市川崎区中瀬三丁目 | カナガワケンカワサキシカワサキクナカゼサンチョウメ | 044-123-4052 | 139.7327 | 35.53759 | 962.0 |
32 | S14023 | 川崎店 | 14 | 神奈川県 | 神奈川県川崎市川崎区本町二丁目 | カナガワケンカワサキシカワサキクホンチョウニチョウメ | 044-123-4037 | 139.7028 | 35.53599 | 1804.0 |
33 | S13018 | 清瀬店 | 13 | 東京都 | 東京都清瀬市松山一丁目 | トウキョウトキヨセシマツヤマイッチョウメ | 042-123-4017 | 139.5178 | 35.76885 | 1220.0 |
35 | S14027 | 南藤沢店 | 14 | 神奈川県 | 神奈川県藤沢市南藤沢 | カナガワケンフジサワシミナミフジサワ | 046-123-4041 | 139.4896 | 35.33762 | 1521.0 |
36 | S14021 | 伊勢原店 | 14 | 神奈川県 | 神奈川県伊勢原市伊勢原四丁目 | カナガワケンイセハラシイセハラヨンチョウメ | 046-123-4035 | 139.3129 | 35.40169 | 962.0 |
37 | S14047 | 相模原店 | 14 | 神奈川県 | 神奈川県相模原市千代田六丁目 | カナガワケンサガミハラシチヨダロクチョウメ | 042-123-4050 | 139.3748 | 35.55959 | 1047.0 |
38 | S12013 | 習志野店 | 12 | 千葉県 | 千葉県習志野市芝園一丁目 | チバケンナラシノシシバゾノイッチョウメ | 047-123-4002 | 140.0220 | 35.66122 | 808.0 |
40 | S14042 | 新山下店 | 14 | 神奈川県 | 神奈川県横浜市中区新山下二丁目 | カナガワケンヨコハマシナカクシンヤマシタニチョウメ | 045-123-4047 | 139.6593 | 35.43894 | 1044.0 |
42 | S12030 | 八幡店 | 12 | 千葉県 | 千葉県市川市八幡三丁目 | チバケンイチカワシヤワタサンチョウメ | 047-123-4005 | 139.9240 | 35.72318 | 1162.0 |
44 | S14025 | 大和店 | 14 | 神奈川県 | 神奈川県大和市下和田 | カナガワケンヤマトシシモワダ | 046-123-4039 | 139.4680 | 35.43414 | 1011.0 |
45 | S14045 | 厚木店 | 14 | 神奈川県 | 神奈川県厚木市中町二丁目 | カナガワケンアツギシナカチョウニチョウメ | 046-123-4048 | 139.3651 | 35.44182 | 980.0 |
47 | S12029 | 東野店 | 12 | 千葉県 | 千葉県浦安市東野一丁目 | チバケンウラヤスシヒガシノイッチョウメ | 047-123-4004 | 139.8968 | 35.65086 | 1101.0 |
49 | S12053 | 高洲店 | 12 | 千葉県 | 千葉県浦安市高洲五丁目 | チバケンウラヤスシタカスゴチョウメ | 047-123-4006 | 139.9176 | 35.63755 | 1555.0 |
51 | S14024 | 三田店 | 14 | 神奈川県 | 神奈川県川崎市多摩区三田四丁目 | カナガワケンカワサキシタマクミタヨンチョウメ | 044-123-4038 | 139.5424 | 35.60770 | 972.0 |
52 | S14006 | 葛が谷店 | 14 | 神奈川県 | 神奈川県横浜市都筑区葛が谷 | カナガワケンヨコハマシツヅキククズガヤ | 045-123-4031 | 139.5633 | 35.53573 | 1886.0 |
解説:
このコードでは、PythonのPandasライブラリを使用して、df_storeという名前のDataFrameから行をフィルタリングしています。フィルタリングは、query()メソッドで指定された条件に基づいて行われ、このメソッドはブール式を表す文字列引数を取ります。
tel_no : df_store DataFrameのカラムであると仮定する。
. : Pythonでオブジェクトのメソッドや属性にアクセスする際に使用されるドット記法です。
str: tel_noカラムの文字列メソッドを参照する。
contains() : カラムの各要素に与えられた部分文字列または正規表現が存在するかどうかをチェックする文字列メソッドです。
r'^[0-9]{3}-[0-9]{3}-[0-9]{4}$': これは、北米の電話番号の形式(3桁、ハイフン、さらに3桁、さらにハイフン、さらに4桁)を持つ文字列にマッチする正規表現パターンである。パターンの前のr接頭辞は、それが生の文字列であることを示し、これはバックスラッシュがエスケープ文字ではなく、リテラルバックスラッシュとして扱われることを意味します。中括弧{}は、直前のパターンを指定回数繰り返すことを示し、末尾の$は文字列の終わりを意味する。
また、query()メソッドでは、engineの引数に'python'という値が指定されています。これは、Pandasが使用するデフォルトのエンジンがnumexprで、クエリの種類によっては高速に処理できますが、すべての種類の正規表現に対応していない場合があるからです。python' エンジンを使用すると、正規表現が Python regex モジュールによって処理されるようになります。
結果として、df_store DataFrameから、tel_noカラムに有効な北米の電話番号を持つ行だけを残すフィルタが作成されます。
P-017: 顧客データ(df_customer)を生年月日(birth_day)で高齢順にソートし、先頭から全項目を10件表示せよ。
df_customer.sort_values('birth_day').head(10)
customer_id | customer_name | gender_cd | gender | birth_day | age | postal_cd | address | application_store_cd | application_date | status_cd | |
---|---|---|---|---|---|---|---|---|---|---|---|
18817 | CS003813000014 | 村山 菜々美 | 1 | 女性 | 1928-11-26 | 90 | 182-0007 | 東京都調布市菊野台********** | S13003 | 20160214 | 0-00000000-0 |
12328 | CS026813000004 | 吉村 朝陽 | 1 | 女性 | 1928-12-14 | 90 | 251-0043 | 神奈川県藤沢市辻堂元町********** | S14026 | 20150723 | 0-00000000-0 |
15682 | CS018811000003 | 熊沢 美里 | 1 | 女性 | 1929-01-07 | 90 | 204-0004 | 東京都清瀬市野塩********** | S13018 | 20150403 | 0-00000000-0 |
15302 | CS027803000004 | 内村 拓郎 | 0 | 男性 | 1929-01-12 | 90 | 251-0031 | 神奈川県藤沢市鵠沼藤が谷********** | S14027 | 20151227 | 0-00000000-0 |
1681 | CS013801000003 | 天野 拓郎 | 0 | 男性 | 1929-01-15 | 90 | 274-0824 | 千葉県船橋市前原東********** | S12013 | 20160120 | 0-00000000-0 |
7511 | CS001814000022 | 鶴田 里穂 | 1 | 女性 | 1929-01-28 | 90 | 144-0045 | 東京都大田区南六郷********** | S13001 | 20161012 | A-20090415-7 |
2378 | CS016815000002 | 山元 美紀 | 1 | 女性 | 1929-02-22 | 90 | 184-0005 | 東京都小金井市桜町********** | S13016 | 20150629 | C-20090923-C |
4680 | CS009815000003 | 中田 里穂 | 1 | 女性 | 1929-04-08 | 89 | 154-0014 | 東京都世田谷区新町********** | S13009 | 20150421 | D-20091021-E |
16070 | CS005813000015 | 金谷 恵梨香 | 1 | 女性 | 1929-04-09 | 89 | 165-0032 | 東京都中野区鷺宮********** | S13005 | 20150506 | 0-00000000-0 |
6305 | CS012813000013 | 宇野 南朋 | 1 | 女性 | 1929-04-09 | 89 | 231-0806 | 神奈川県横浜市中区本牧町********** | S14012 | 20150712 | 0-00000000-0 |
解説:
このコードでは、PythonのPandasライブラリを使用して、df_customerというDataFrameの行をbirth_day列の値に基づいて昇順でソートしています。その結果、ソートされたDataFrameは、head()メソッドを使用して、最初の10行に限定されます。
df_customer: これは、ソートされるDataFrameの名前です。
sort_values() : これは、1つ以上のカラムの値に基づいてDataFrameをソートするために使用されるPandasのメソッドである。この場合、birth_dayカラムがソートキーとして指定されています。
'birth_day' : ソートキーとして使用されるカラムの名前です。
.head(10): これは、出力をソートされたDataFrameの最初の10行に制限するメソッド呼び出しです。
結果として、df_customer DataFrameの最初の10行が、birth_dayカラムの値に基づいて昇順にソートされた状態で出力されることになります。これにより、birth_dayが顧客の生年月日を表していると仮定して、データセット内の最も古い10人の顧客を確認することができます。
P-018: 顧客データ(df_customer)を生年月日(birth_day)で若い順にソートし、先頭から全項目を10件表示せよ。
df_customer.sort_values('birth_day', ascending=False).head(10)
customer_id | customer_name | gender_cd | gender | birth_day | age | postal_cd | address | application_store_cd | application_date | status_cd | |
---|---|---|---|---|---|---|---|---|---|---|---|
15639 | CS035114000004 | 大村 美里 | 1 | 女性 | 2007-11-25 | 11 | 156-0053 | 東京都世田谷区桜********** | S13035 | 20150619 | 6-20091205-6 |
7468 | CS022103000002 | 福山 はじめ | 9 | 不明 | 2007-10-02 | 11 | 249-0006 | 神奈川県逗子市逗子********** | S14022 | 20160909 | 0-00000000-0 |
10745 | CS002113000009 | 柴田 真悠子 | 1 | 女性 | 2007-09-17 | 11 | 184-0014 | 東京都小金井市貫井南町********** | S13002 | 20160304 | 0-00000000-0 |
19811 | CS004115000014 | 松井 京子 | 1 | 女性 | 2007-08-09 | 11 | 165-0031 | 東京都中野区上鷺宮********** | S13004 | 20161120 | 1-20081231-1 |
7039 | CS002114000010 | 山内 遥 | 1 | 女性 | 2007-06-03 | 11 | 184-0015 | 東京都小金井市貫井北町********** | S13002 | 20160920 | 6-20100510-1 |
3670 | CS025115000002 | 小柳 夏希 | 1 | 女性 | 2007-04-18 | 11 | 245-0018 | 神奈川県横浜市泉区上飯田町********** | S14025 | 20160116 | D-20100913-D |
12493 | CS002113000025 | 広末 まなみ | 1 | 女性 | 2007-03-30 | 12 | 184-0015 | 東京都小金井市貫井北町********** | S13002 | 20171030 | 0-00000000-0 |
15977 | CS033112000003 | 長野 美紀 | 1 | 女性 | 2007-03-22 | 12 | 245-0051 | 神奈川県横浜市戸塚区名瀬町********** | S14033 | 20150606 | 0-00000000-0 |
5716 | CS007115000006 | 福岡 瞬 | 1 | 女性 | 2007-03-10 | 12 | 285-0845 | 千葉県佐倉市西志津********** | S12007 | 20151118 | F-20101016-F |
15097 | CS014113000008 | 矢口 莉緒 | 1 | 女性 | 2007-03-05 | 12 | 260-0041 | 千葉県千葉市中央区東千葉********** | S12014 | 20150622 | 3-20091108-6 |
解説:
このコードでは、PythonのPandasライブラリを使用して、df_customerというDataFrameの行をbirth_day列の値に基づいて降順でソートしています。その結果、ソートされたDataFrameは、head()メソッドを使用して、最初の10行に限定されます。
df_customer: これは、ソートされるDataFrameの名前です。
sort_values() : これはPandasのメソッドで、1つ以上のカラムの値に基づいてDataFrameをソートするために使用されます。この場合、birth_dayカラムがソートキーとして指定されています。
'birth_day' : ソートキーとして使用されるカラムの名前です。
ascending=False : この引数は、ソート順をデフォルトの昇順ではなく、降順にすることを指定するために使用されます。
.head(10): これは、出力をソートされたDataFrameの最初の10行に制限するメソッド呼び出しです。
結果として出力されるのは、df_customer DataFrameの最初の10行で、birth_day列の値に基づいて降順でソートされます。これにより、birth_dayが顧客の生年月日を表していると仮定して、データセット内の最も若い10人の顧客を確認することができます。
P-019: レシート明細データ(df_receipt)に対し、1件あたりの売上金額(amount)が高い順にランクを付与し、先頭から10件表示せよ。項目は顧客ID(customer_id)、売上金額(amount)、付与したランクを表示させること。なお、売上金額(amount)が等しい場合は同一順位を付与するものとする。
df_tmp = pd.concat([df_receipt[['customer_id', 'amount']]
,df_receipt['amount'].rank(method='min',
ascending=False)], axis=1)
df_tmp.columns = ['customer_id', 'amount', 'ranking']
df_tmp.sort_values('ranking').head(10)
customer_id | amount | ranking | |
---|---|---|---|
1202 | CS011415000006 | 10925 | 1.0 |
62317 | ZZ000000000000 | 6800 | 2.0 |
54095 | CS028605000002 | 5780 | 3.0 |
4632 | CS015515000034 | 5480 | 4.0 |
72747 | ZZ000000000000 | 5480 | 4.0 |
10320 | ZZ000000000000 | 5480 | 4.0 |
97294 | CS021515000089 | 5440 | 7.0 |
28304 | ZZ000000000000 | 5440 | 7.0 |
92246 | CS009415000038 | 5280 | 9.0 |
68553 | CS040415000200 | 5280 | 9.0 |
解説:
与えられたコードは、以下の処理を実行しています。
pd.concat()関数を使用して、2つのデータフレームdf_receipt[['customer_id', 'amount']] と df_receipt['amount'].rank(method='min', ascending=False) を列軸 (axis=1) に沿って連結しています。得られたデータフレームは、変数df_tmpに代入される。最初のdataframe df_receipt[['customer_id', 'amount']]には、より大きなdataframe df_receiptから2つの列 'customer_id' と 'amount' が含まれていますが、2番目のdataframeは 'min' 法で計算した 'amount' 列の降順の順位となっています。
連結されたdf_tmpのカラムを、df_tmp.columns属性を用いて、'customer_id', 'amount', 'ranking'にリネームする。
sort_values()メソッドでdf_tmpのデータフレームを'ranking'列で昇順にソートし、head(10)メソッドで上位10行を返します。
全体として、このコードはdf_receipt dataframeの'customer_id'と'amount'カラムと'min'メソッドで計算した'amount'の順位を降順に連結しています。結果として得られるdataframeは、'ranking'カラムでソートされ、最も高いランクを持つ上位10行を返します。これは、購入に最もお金をかけた顧客を表しています。
P-020: レシート明細データ(df_receipt)に対し、1件あたりの売上金額(amount)が高い順にランクを付与し、先頭から10件表示せよ。項目は顧客ID(customer_id)、売上金額(amount)、付与したランクを表示させること。なお、売上金額(amount)が等しい場合でも別順位を付与すること。
df_tmp = pd.concat([df_receipt[['customer_id', 'amount']]
,df_receipt['amount'].rank(method='first',
ascending=False)], axis=1)
df_tmp.columns = ['customer_id', 'amount', 'ranking']
df_tmp.sort_values('ranking').head(10)
customer_id | amount | ranking | |
---|---|---|---|
1202 | CS011415000006 | 10925 | 1.0 |
62317 | ZZ000000000000 | 6800 | 2.0 |
54095 | CS028605000002 | 5780 | 3.0 |
4632 | CS015515000034 | 5480 | 4.0 |
10320 | ZZ000000000000 | 5480 | 5.0 |
72747 | ZZ000000000000 | 5480 | 6.0 |
28304 | ZZ000000000000 | 5440 | 7.0 |
97294 | CS021515000089 | 5440 | 8.0 |
596 | CS015515000083 | 5280 | 9.0 |
11275 | CS017414000114 | 5280 | 10.0 |
解説:
与えられたコードは、以下の処理を実行しています。
pd.concat()関数を使用して、2つのデータフレームdf_receipt[['customer_id', 'amount']] と df_receipt['amount'].rank(method='first', ascending=False) を列軸 (axis=1) で連結しています。得られたデータフレームは、変数df_tmpに代入される。最初のdataframe df_receipt[['customer_id', 'amount']]には、より大きなdataframe df_receiptから2つの列 'customer_id' と 'amount' が含まれていますが、2番目のdataframeは 'first' 方式で計算した 'amount' 列を降順にした順位となっています。
連結されたdf_tmpの列を、df_tmp.columns属性を用いて、'customer_id', 'amount', 'ranking'にリネームする。
sort_values()メソッドでdf_tmpのデータフレームを'ranking'列で昇順にソートし、head(10)メソッドで上位10行を返します。
全体として、このコードはdf_receipt dataframeの'customer_id'と'amount'カラムと'first'メソッドで計算した'amount'の順位を降順に連結しています。出来上がったdataframeは'ranking'カラムでソートされ、最も高いランクを持つ上位10行を返します。これは、購入した商品に最もお金をかけた顧客を表しています。このコードと前のコードとの唯一の違いは、使用されているランクメソッドです。ここでは「first」メソッドを使用しており、「amount」カラムの同じ値に同じランクを割り当てています。一方、「min」メソッド「amount」カラムの同じ値に最も低いランクを割り当てています。
Comment