
はじめに
データ分析・データサイエンスの初心者・初学者に最初に覚えて欲しいPythonの構文がいくつかあります。
今回はその中の一つである、データ分析でよく使うPython構文である無名関数lambda式、内包表記、map関数文を紹介します。
このブログでは、①基本をしっかりと示し、②実際のデータ分析でどのように使われるかという具体例を紹介します!
読み終えたあとには、しっかりとその構文が身についていると思います。
lambda式~基本~
無名関数とは、名前がない関数で、その場に記述することで関数が構成できます。その無名関数であるlambdaは、半角スペースの後ろに引数を記述して、: のあとに返り値を記入します。
それでは、掛け算をする関数をgooglecolobで動かしてみます。
Google Colaboratoryについては知りたい方は、以下のブログ記事を参考にしてください。
>>Google Colaboratoryとは? いつできた? mount、ファイルの読み込み等の使い方
>>Google Colaboratoryよく使う便利なショートカットキー
それでは、はじめましょう!!
赤の囲みが引数、青の囲みが返り値(a×b)、緑の囲みがa、bに代入される値です。
それでは、計算結果を見てみましょう。
a×b=30ができました。
lambda式はどんな時に使うかというと、関数defを作るほどでもないけれど、簡単に関数処理をしたい場合に使用します。つまり、関数をいちいち定義することなく、処理することがきるので、コードを短くしたい場合に利用されます。
lambda式~map関数~
map関数は、要素に対して、何か処理をしたい場合に使用します。map()内に、引数や返り値を記入することで利用できます。lambda式とあわせて利用される場合がありますので、ここで覚えておきましょう。
xに入っているリストを大文字にする処理をしてみましょう!
せっかくなので、for文で書いた場合や内包表記で書いた場合と比べてみます。
for文
1行目は大文字にしたものを入れるリストXを作成しました。
2行目、3行目はfor文です。xに入っている小文字の名前リストを一つずつ取り出して、xxにいれます。そのxxを.upper()を使用して大文字に変換し、それを.append()を利用して、Xに加えます。
最後にXを表示します。このようにfor文だと4行ほど使いますね。
内包表記
内包表記は先に①返り値であるxx.upper()を記入して、その後に②for文を書きます。それをリスト形式にしますので、[ ]で囲います。今回は1行で済みました。
map関数を用いたlamba式
lambdaは、半角スペースの後ろに引数を記述して、: のあとに返り値を記入します。そして、map関数は、後ろから見ていくとわかりやすいです。
xという小文字の名前が入っているリストを、xxにいれて、そのxxを大文字に変換するという処理をして、それをリスト形式にしたいので、list()内に入れています。
こちらも1行で書けましたね。
lambda式に、map関数を用いて利用する場合も多くありますので覚えておいてください。
内包表記を用いて数字をbool値に変換
yに以下のような数字が入っているとします。

この数字のうち、0をFalse、それ以外をTrueというbool値(ブール値)にしたい場合には、内包表記を使えば、簡単に数字からbool値に変換できます。
さっそくやってみましょう!
print([i > 1 for i in y])

それでは、逆に0をTrue、それ以外をFalseというbool値(ブール値)にしたい場合にはどのようにすればよいでしょうか。
print([i == 0 for i in y])

これで、0をTrue、それ以外をFalseというbool値(ブール値)に変換できました!
lambda式~データ分析で実際に使われるような具体例~
lambda式を用いている具体例を見てましょう。
まず、データサイエンス100本ノック(構造化データ加工編)の問29を用います。
if文を学びたい方は下記のブログ記事を参考にしてください。
>>【データ分析初心者】Python構文~if文、format記法とf文字列~
データサイエンス100本ノック(構造化データ加工編)を知りたい方は下記のブログ記事を参考にしてください。
>>【Google Colabはじめ方】データサイエンス100本ノックーデータサイエンティスト協会
問29 レシート明細データフレーム(df_receipt)に対し、店舗コード(store_cd)ごとに商品コード(product_cd)の最頻値を求めよ。
df_receiptの中身を見てみます。

df_receiptに対し、store_cdごとに表示する必要があるので、groupby()を使用します。
そして、product_cdの最頻値を求める必要があります。最頻値とは、最も多い度数(頻度)を示す値です。つまり分布図上のグラフが一番高い値です。
今回は最頻値を求める時に、lambda式を用います。
lambda x:x.mode()
引数xに、返り値として最頻値を求めるmode()を適用して、それをproduct_cdという列に対して、適用したいので、apply()を使用します。
また、インデックスが消えないように、最後にreset_index()を使用します。
df_receipt.groupby('store_cd').product_cd.apply(lambda x:x.mode()).reset_index()
これで、lambda式によってproduct_cdの最頻値を求めて、それをstore_cdごとに表示できました。
*コード結果は下部省略
lambda式とif文と内包表記の混合~データ分析で実際に使われるような具体例~
lambda式とif文と内包表記を用いている具体例を見てましょう。
これには、データサイエンス100本ノック(構造化データ加工編)の問52を用います。
問52 レシート明細データフレーム(df_receipt)の売上金額(amount)を顧客ID(customer_id)ごとに合計の上、売上金額合計に対して2,000円以下を0、2,000円より大きい金額を1に2値化し、顧客ID、売上金額合計とともに10件表示せよ。ただし、顧客IDが”Z”から始まるのものは非会員を表すため、除外して計算すること。
df_receiptの中身は先ほどと同じです。
df_receiptの売上金額(amount)を顧客ID(customer_id)ごとに合計」したデータフレームを作成します。なお、「顧客IDが“Z”から始まるのものは非会員を表すため、除外」します。
df_sales_amount = df_receipt.query('not customer_id.str.startswith("Z") ',engine='python').groupby('customer_id').amount.sum().reset_index()
次に、売上金額合計に対して2,000円以下を0、2,000円より大きい金額を1に2値化したカラムを作成し、顧客ID、売上金額合計とともに10件表示します。
2値化したカラムはsales_flagとし、「売上金額合計に対して2,000円以下を0、2,000円より大きい金額を1」については、lambda式とif文を用いて作成します。
df_sales_amount['sales_flag'] = df_sales_amount['amount'].apply(lambda x:1 if x > 2000 else 0)
もし、売上金額合計(amount)が、2,000円以上なら1を返します。それ以外の場合には、0を返すという処理をamount一つ一つに適用します。
データ分析入門・データサイエンス初心者・初学者向けにデータ分析でよく使うPythonをまとめました。
>>【データ分析初心者】Python構文~for文、range関数、zip関数、enumerate関数
>>【データ分析初心者】Python構文~if文、format記法とf文字列~
>>【データ分析初心者】Pandas~loc[]、iloc[]、スライス、drop()、isin()~
>>【データ分析初心者】Matplotlib、Seabornーscatter()、hist()、countplot() 、barplot()
>>【データ分析初心者】Pythonを使って、和暦から西暦への変換を行う
書籍や動画でデータ分析を学びたい方へ
機械学習やデータサイエンスを独学で学びたい方のために、ブログ記事をまとめてみました。
書籍、動画などなど、厳選したオススメの方法をまとめています。
興味がある方はご覧ください。
