当ページのリンクには広告が含まれています。
✓目次
本記事の対象者
・ データサイエンティストを目指している人
・ lambda式の使い方の基礎を知りたい人
・ 最頻値の求め方を知りたい人
本記事で学ぶPythonの基礎
本記事では以下のメソッドおよび記法を学びます。
早速データサイエンス100本ノックの問題を題材に、これらの使い方を学んでいきたいと思います。
データサイエンス100本ノックの始め方は、以下の記事を参考にしていただければと思います。
>>データサイエンス100本ノックの始め方
第29問目: 最頻値の出力方法
P-029: レシート明細データフレーム(df_receipt)に対し、店舗コード(store_cd)ごとに商品コード(product_cd)の最頻値を求めよ。
最頻値を求める際は、少し特殊な方法が用いられます。
データフレームの各行もしくは各列に対してなんらかしらの関数を適用するメソッドであるapply
メソッドを使用します。
apply
メソッドの使い方としては、データに適用したい関数もしくはlambda式を定義し、apply
の引数に渡します。
最頻値を求めるメソッドは、mode
メソッドになりますので、lambda式を用いてmodeメソッドを適用することになります。
lambda式とは
lambda式とは、Pythonにおける関数作成を簡素化することができる記述様式です。
例えば、以下のように2乗を出力関数を定義したとします。
通常の関数定義1 2
| def func(x): return x ** 2
|
これをlambda式を用いると以下のようにコードを簡素化することが出来ます。
このようにlambda式の構造はlambda 引数: 返り値
という構造になります。
lambda式に引数を渡して実際に計算する場合は、以下のように指定するだけで、def
で作成した関数と同じように使用できます。
lambda式に引数を渡して計算1 2
| # funcに引数aを渡して、計算結果をyに格納する y = func(a)
|
データフレームと併用する場合は、df.apply(lambda 引数: 返り値)
とすれば良いです。
データフレームと併用する場合のlambdaの使い方1 2
| df = DataFrame({"id": [10, 20, 30], "age": [5, 10, 15], "weight":[30, 40, 50]}) df.apply(lambda x: x+10)
|
実際にlambda式を使う例を以下に紹介します。
1 2 3 4 5
| import pandas as pd from pandas import DataFrame
df = DataFrame({"id": [10, 20, 30], "age": [5, 10, 15], "weight":[30, 40, 50]}) df.apply(lambda x: x+10)
|
出力1 2 3 4
| id age weight 0 20 15 40 1 30 20 50 2 40 25 60
|
このように、全てのフィールドに10がプラスされたことが分かります。
これらの知識を用いて問題を解いていきます。
第29問目の回答
過去の問題で学んだgroupbyメソッドを用いて、store_cd
をグルーピングし、product_cd
に対してapply
メソッドを適用し、mode
で最頻値を表示します。
>groupbyメソッドの使い方の詳細はこちら
1
| df_receipt.groupby('store_cd').product_cd.apply(lambda x: x.mode())
|
出力1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57
| store_cd S12007 0 P060303001 S12013 0 P060303001 S12014 0 P060303001 S12029 0 P060303001 S12030 0 P060303001 S13001 0 P060303001 S13002 0 P060303001 S13003 0 P071401001 S13004 0 P060303001 S13005 0 P040503001 S13008 0 P060303001 S13009 0 P060303001 S13015 0 P071401001 S13016 0 P071102001 S13017 0 P060101002 S13018 0 P071401001 S13019 0 P071401001 S13020 0 P071401001 S13031 0 P060303001 S13032 0 P060303001 S13035 0 P040503001 S13037 0 P060303001 S13038 0 P060303001 S13039 0 P071401001 S13041 0 P071401001 S13043 0 P060303001 S13044 0 P060303001 S13051 0 P050102001 1 P071003001 2 P080804001 S13052 0 P050101001 S14006 0 P060303001 S14010 0 P060303001 S14011 0 P060101001 S14012 0 P060303001 S14021 0 P060101001 S14022 0 P060303001 S14023 0 P071401001 S14024 0 P060303001 S14025 0 P060303001 S14026 0 P071401001 S14027 0 P060303001 S14028 0 P060303001 S14033 0 P071401001 S14034 0 P060303001 S14036 0 P040503001 1 P060101001 S14040 0 P060303001 S14042 0 P050101001 S14045 0 P060303001 S14046 0 P060303001 S14047 0 P060303001 S14048 0 P050101001 S14049 0 P060303001 S14050 0 P060303001 Name: product_cd, dtype: object
|
indexがなくなっているので、reset_index()
メソッドでindexを付与します。
>reset_indexの使い方の詳細はこちら
1
| df_receipt.groupby('store_cd').product_cd.apply(lambda x: x.mode()).reset_index()
|
出力1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56
| store_cd level_1 product_cd 0 S12007 0 P060303001 1 S12013 0 P060303001 2 S12014 0 P060303001 3 S12029 0 P060303001 4 S12030 0 P060303001 5 S13001 0 P060303001 6 S13002 0 P060303001 7 S13003 0 P071401001 8 S13004 0 P060303001 9 S13005 0 P040503001 10 S13008 0 P060303001 11 S13009 0 P060303001 12 S13015 0 P071401001 13 S13016 0 P071102001 14 S13017 0 P060101002 15 S13018 0 P071401001 16 S13019 0 P071401001 17 S13020 0 P071401001 18 S13031 0 P060303001 19 S13032 0 P060303001 20 S13035 0 P040503001 21 S13037 0 P060303001 22 S13038 0 P060303001 23 S13039 0 P071401001 24 S13041 0 P071401001 25 S13043 0 P060303001 26 S13044 0 P060303001 27 S13051 0 P050102001 28 S13051 1 P071003001 29 S13051 2 P080804001 30 S13052 0 P050101001 31 S14006 0 P060303001 32 S14010 0 P060303001 33 S14011 0 P060101001 34 S14012 0 P060303001 35 S14021 0 P060101001 36 S14022 0 P060303001 37 S14023 0 P071401001 38 S14024 0 P060303001 39 S14025 0 P060303001 40 S14026 0 P071401001 41 S14027 0 P060303001 42 S14028 0 P060303001 43 S14033 0 P071401001 44 S14034 0 P060303001 45 S14036 0 P040503001 46 S14036 1 P060101001 47 S14040 0 P060303001 48 S14042 0 P050101001 49 S14045 0 P060303001 50 S14046 0 P060303001 51 S14047 0 P060303001 52 S14048 0 P050101001 53 S14049 0 P060303001 54 S14050 0 P060303001
|
これで完成です。
まとめ: 最頻値を表示する方法を学びました。
本記事は、「【データサイエンス】Pythonで最頻値を表示する方法 | データサイエンス100本ノック【問29 回答】」というテーマでまとめました。
最頻値を表示するためには以下のメソッドを活用しましょう。
以上です。
リンク