データサイエンス 100 本ノックとは

The-Japan-DataScientist-Society/100knocks-preprocess: データサイエンス 100 本ノック(構造化データ加工編)

Google Colab で データサイエンス 100 本ノックをするにあたって

以下の ipynb ファイルを使用させていただきました。

noguhiro2002/100knocks-preprocess_ForColab-AzureNotebook: データサイエンス 100 本ノック(構造化データ加工編)For Azure_Notebook/Google_Colabo

実行ファイル

データサイエンス 100 本ノック by tomowarkar

011

P-011: 顧客データフレーム(df_customer)から顧客 ID(customer_id)の末尾が 1 のものだけ全項目抽出し、10 件だけ表示せよ。

df_customer[df_customer.customer_id.str.endswith("1")].head(10)
        customer_id customer_name  ...  application_date     status_cd
1    CS037613000071         六角 雅彦  ...          20150414  0-00000000-0
3    CS028811000001        堀井 かおり  ...          20160115  0-00000000-0
14   CS040412000191         川井 郁恵  ...          20151101  1-20091025-4
31   CS028314000011        小菅 あおい  ...          20151123  1-20080426-5
56   CS039212000051        藤島 恵梨香  ...          20171121  1-20100215-4
59   CS015412000111         松居 奈月  ...          20150629  0-00000000-0
63   CS004702000041          野島 洋  ...          20170218  0-00000000-0
74   CS041515000001         栗田 千夏  ...          20160422  E-20100803-F
85   CS029313000221        北条 ひかり  ...          20180810  0-00000000-0
102  CS034312000071         望月 奈央  ...          20160106  0-00000000-0

[10 rows x 11 columns]

012

P-012: 店舗データフレーム(df_store)から横浜市の店舗だけ全項目表示せよ。

df_store[df_store.address.str.contains("横浜市")]
   store_cd store_name  prefecture_cd  ... longitude  latitude floor_area
2    S14010        菊名店             14  ...  139.6326  35.50049     1732.0
3    S14033       阿久和店             14  ...  139.4961  35.45918     1495.0
7    S14040       長津田店             14  ...  139.4994  35.52398     1548.0
9    S14050      阿久和西店             14  ...  139.4961  35.45918     1830.0
12   S14028       二ツ橋店             14  ...  139.4963  35.46304     1574.0
16   S14012      本牧和田店             14  ...  139.6582  35.42156     1341.0
18   S14046       北山田店             14  ...  139.5916  35.56189      831.0
20   S14011      日吉本町店             14  ...  139.6316  35.54655      890.0
26   S14048      中川中央店             14  ...  139.5758  35.54912     1657.0
40   S14042       新山下店             14  ...  139.6593  35.43894     1044.0
52   S14006       葛が谷店             14  ...  139.5633  35.53573     1886.0

[11 rows x 10 columns]

013

P-013: 顧客データフレーム(df_customer)から、ステータスコード(status_cd)の先頭がアルファベットの A〜F で始まるデータを全項目抽出し、10 件だけ表示せよ。

df_customer[df_customer.status_cd.str.match("[A-F]")].head(10)
       customer_id customer_name  ...  application_date     status_cd
2   CS031415000172       宇多田 貴美子  ...          20150529  D-20100325-C
6   CS015414000103         奥野 陽子  ...          20150722  B-20100609-B
12  CS011215000048         芦田 沙耶  ...          20150228  C-20100421-9
15  CS029415000023         梅田 里穂  ...          20150610  D-20100918-E
21  CS035415000029         寺沢 真希  ...          20141220  F-20101029-F
32  CS031415000106        宇野 由美子  ...          20150201  F-20100511-E
33  CS029215000025         石倉 美帆  ...          20150708  B-20100820-C
40  CS033605000005         猪股 雄太  ...          20150425  F-20100917-E
44  CS033415000229        板垣 菜々美  ...          20150712  F-20100326-E
53  CS008415000145         黒谷 麻緒  ...          20150829  F-20100622-F

[10 rows x 11 columns]

str.match は先頭一致で正規表現に一致するものを抽出できます。

014

P-014: 顧客データフレーム(df_customer)から、ステータスコード(status_cd)の末尾が数字の 1〜9 で終わるデータを全項目抽出し、10 件だけ表示せよ。

df_customer[df_customer.status_cd.str.contains("[1-9]$", regex=True)].head(10)
       customer_id customer_name  ...  application_date     status_cd
4   CS001215000145         田崎 美紀  ...          20170605  6-20090929-2
9   CS033513000180          安斎 遥  ...          20150728  6-20080506-5
12  CS011215000048         芦田 沙耶  ...          20150228  C-20100421-9
14  CS040412000191         川井 郁恵  ...          20151101  1-20091025-4
16  CS009315000023         皆川 文世  ...          20150319  5-20080322-1
22  CS015315000033        福士 璃奈子  ...          20141024  4-20080219-3
23  CS023513000066         神戸 そら  ...          20150915  5-20100524-9
24  CS035513000134         市川 美帆  ...          20150227  8-20100711-9
27  CS001515000263         高松 夏空  ...          20160812  1-20100804-1
28  CS040314000027       鶴田 きみまろ  ...          20150122  2-20080426-4

[10 rows x 11 columns]

015

P-015: 顧客データフレーム(df_customer)から、ステータスコード(status_cd)の先頭がアルファベットの A〜F で始まり、末尾が数字の 1〜9 で終わるデータを全項目抽出し、10 件だけ表示せよ。

df_customer[df_customer.status_cd.str.match("[A-F].*\d$")].head(10)
        customer_id customer_name  ...  application_date     status_cd
12   CS011215000048         芦田 沙耶  ...          20150228  C-20100421-9
68   CS022513000105        島村 貴美子  ...          20150320  A-20091115-7
71   CS001515000096         水野 陽子  ...          20150614  A-20100724-7
122  CS013615000053         西脇 季衣  ...          20150128  B-20100329-6
144  CS020412000161          小宮 薫  ...          20150822  B-20081021-3
178  CS001215000097        竹中 あさみ  ...          20170315  A-20100211-2
252  CS035212000007        内村 恵梨香  ...          20151013  B-20101018-6
259  CS002515000386         野田 コウ  ...          20160410  C-20100127-8
293  CS001615000372        稲垣 寿々花  ...          20170403  A-20100104-1
297  CS032512000121         松井 知世  ...          20150727  A-20100103-5

[10 rows x 11 columns]

016

P-016: 店舗データフレーム(df_store)から、電話番号(tel_no)が 3 桁-3 桁-4 桁のデータを全項目表示せよ。

df_store[df_store.tel_no.str.match("\d{3}-\d{3}-\d{4}$")]
   store_cd store_name  prefecture_cd  ... longitude  latitude floor_area
0    S12014       千草台店             12  ...  140.1180  35.63559     1698.0
1    S13002       国分寺店             13  ...  139.4802  35.70566     1735.0
2    S14010        菊名店             14  ...  139.6326  35.50049     1732.0
3    S14033       阿久和店             14  ...  139.4961  35.45918     1495.0
4    S14036     相模原中央店             14  ...  139.3716  35.57327     1679.0
7    S14040       長津田店             14  ...  139.4994  35.52398     1548.0
9    S14050      阿久和西店             14  ...  139.4961  35.45918     1830.0
11   S13052        森野店             13  ...  139.4383  35.55293     1087.0
12   S14028       二ツ橋店             14  ...  139.4963  35.46304     1574.0
16   S14012      本牧和田店             14  ...  139.6582  35.42156     1341.0
18   S14046       北山田店             14  ...  139.5916  35.56189      831.0
19   S14022        逗子店             14  ...  139.5789  35.29642     1838.0
20   S14011      日吉本町店             14  ...  139.6316  35.54655      890.0
21   S13016       小金井店             13  ...  139.5094  35.70018     1399.0
22   S14034      川崎野川店             14  ...  139.5998  35.57693     1318.0
26   S14048      中川中央店             14  ...  139.5758  35.54912     1657.0
27   S12007        佐倉店             12  ...  140.1452  35.71872     1895.0
28   S14026     辻堂西海岸店             14  ...  139.4466  35.32464     1732.0
29   S13041       八王子店             13  ...  139.4235  35.63787      810.0
31   S14049      川崎大師店             14  ...  139.7327  35.53759      962.0
32   S14023        川崎店             14  ...  139.7028  35.53599     1804.0
33   S13018        清瀬店             13  ...  139.5178  35.76885     1220.0
35   S14027       南藤沢店             14  ...  139.4896  35.33762     1521.0
36   S14021       伊勢原店             14  ...  139.3129  35.40169      962.0
37   S14047       相模原店             14  ...  139.3748  35.55959     1047.0
38   S12013       習志野店             12  ...  140.0220  35.66122      808.0
40   S14042       新山下店             14  ...  139.6593  35.43894     1044.0
42   S12030        八幡店             12  ...  139.9240  35.72318     1162.0
44   S14025        大和店             14  ...  139.4680  35.43414     1011.0
45   S14045        厚木店             14  ...  139.3651  35.44182      980.0
47   S12029        東野店             12  ...  139.8968  35.65086     1101.0
49   S12053        高洲店             12  ...  139.9176  35.63755     1555.0
51   S14024        三田店             14  ...  139.5424  35.60770      972.0
52   S14006       葛が谷店             14  ...  139.5633  35.53573     1886.0

[34 rows x 10 columns]

先頭末尾をバインドしないと

0000-000-0000000-000-00000みたいな番号もマッチするので注意ですね。

017

P-17: 顧客データフレーム(df_customer)を生年月日(birth_day)で高齢順にソートし、先頭 10 件を全項目表示せよ。

df_customer.sort_values("birth_day").head(10)
          customer_id customer_name  ...  application_date     status_cd
18817  CS003813000014        村山 菜々美  ...          20160214  0-00000000-0
12328  CS026813000004         吉村 朝陽  ...          20150723  0-00000000-0
15682  CS018811000003         熊沢 美里  ...          20150403  0-00000000-0
15302  CS027803000004         内村 拓郎  ...          20151227  0-00000000-0
1681   CS013801000003         天野 拓郎  ...          20160120  0-00000000-0
7511   CS001814000022         鶴田 里穂  ...          20161012  A-20090415-7
2378   CS016815000002         山元 美紀  ...          20150629  C-20090923-C
4680   CS009815000003         中田 里穂  ...          20150421  D-20091021-E
16070  CS005813000015        金谷 恵梨香  ...          20150506  0-00000000-0
6305   CS012813000013         宇野 南朋  ...          20150712  0-00000000-0

[10 rows x 11 columns]

018

P-18: 顧客データフレーム(df_customer)を生年月日(birth_day)で若い順にソートし、先頭 10 件を全項目表示せよ。

df_customer.sort_values("birth_day", ascending=False).head(10)
          customer_id customer_name  ...  application_date     status_cd
15639  CS035114000004         大村 美里  ...          20150619  6-20091205-6
7468   CS022103000002        福山 はじめ  ...          20160909  0-00000000-0
10745  CS002113000009        柴田 真悠子  ...          20160304  0-00000000-0
19811  CS004115000014         松井 京子  ...          20161120  1-20081231-1
7039   CS002114000010          山内 遥  ...          20160920  6-20100510-1
3670   CS025115000002         小柳 夏希  ...          20160116  D-20100913-D
12493  CS002113000025        広末 まなみ  ...          20171030  0-00000000-0
15977  CS033112000003         長野 美紀  ...          20150606  0-00000000-0
5716   CS007115000006          福岡 瞬  ...          20151118  F-20101016-F
15097  CS014113000008         矢口 莉緒  ...          20150622  3-20091108-6

[10 rows x 11 columns]

019

P-19: レシート明細データフレーム(df_receipt)に対し、1 件あたりの売上金額(amount)が高い順にランクを付与し、先頭 10 件を抽出せよ。項目は顧客 ID(customer_id)、売上金額(amount)、付与したランクを表示させること。なお、売上金額(amount)が等しい場合は同一順位を付与するものとする。

pd.concat(
    [df_receipt[["customer_id", "amount"]],
      df_receipt.amount.rank(ascending=False, method='min').rename("rank")],
    axis=1
).sort_values("rank").head(10)
          customer_id  amount  rank
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

pandas.Series.rankを使ってランク付します。

020

P-020: レシート明細データフレーム(df_receipt)に対し、1 件あたりの売上金額(amount)が高い順にランクを付与し、先頭 10 件を抽出せよ。項目は顧客 ID(customer_id)、売上金額(amount)、付与したランクを表示させること。なお、売上金額(amount)が等しい場合でも別順位を付与すること。

pd.concat(
    [df_receipt[["customer_id", "amount"]],
      df_receipt.amount.rank(ascending=False, method='first').rename("rank")],
    axis=1
).sort_values("rank").head(10)
          customer_id  amount  rank
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

pandas.Series.rank の引数をmethod='first'にすることで同一値は登場順にランク付されます。