【データ分析初心者】Python構文~無名関数lambda式、内包表記、map関数、内包表記を用いて数字をbool値に変換~

※アフィリエイト広告を利用しています。

はじめに

データ分析データサイエンスの初心者初学者に最初に覚えて欲しいPythonの構文がいくつかあります。

今回はその中の一つである、データ分析でよく使うPython構文である無名関数lambda式、内包表記、map関数文を紹介します

このブログでは、①基本をしっかりと示し、②実際のデータ分析でどのように使われるかという具体例を紹介します!

読み終えたあとには、しっかりとその構文が身についていると思います。

lambda式~基本~

無名関数とは、名前がない関数で、その場に記述することで関数が構成できます。その無名関数であるlambdaは、半角スペースの後ろに引数を記述して、: のあとに返り値を記入します。

それでは、掛け算をする関数をgooglecolobで動かしてみます。

それでは、はじめましょう!!

囲み引数青の囲み返り値(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()

引数に、返り値として最頻値を求める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円以下02,000円より大きい金額12値化したカラムを作成し、顧客ID売上金額合計とともに10件表示します。

2値化したカラムはsales_flagとし、「売上金額合計に対して2,000円以下02,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一つ一つに適用します。

書籍や動画でデータ分析を学びたい方へ

機械学習データサイエンス独学で学びたい方のために、ブログ記事まとめてみました。

書籍、動画などなど、厳選したオススメの方法をまとめています。

興味がある方はご覧ください。