【データ分析初心者】Python構文~for文、range関数、zip関数、enumerate関数~

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

はじめに

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

今回はその中の一つである、データ分析でよく使うPython構文であるfor文、range関数、zip関数、enumerate関数を紹介します

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

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

for文~基本~

for文とは、リストから一つずつデータを取り出して、繰り返し処理を行える文です。

簡単なものを、googlecolobで動かしてみます。

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

例えば、list1,2,3が入っていて、これを1つずつ表示する処理は以下になります。

なお、list[0]でlistの1個目要素を取り出せることができます。pythonでは、1からでなく0番目が最初の番号なので注意しましょう!

これをfor文で書くとこのようにできます。for文if文の時と同じく、インデントを下げましょう。

リストの数が3個ぐらいなので、for文じゃなくてもよさそうですが、これが10個だったらどうでしょうか?

print文を10個書くのは大変ですね。これがfor文だと3行で終わります。

for文の基本はこれで終了です。

for文~range関数~

次に、range関数を見てみましょう!

range()の中に整数をいれると、上記と同じような結果を得ることができます。( )内に入れた整数-1個の値が取り出されるので注意です。

また、range()の中をカンマ2つ区切ることもできます。最初の区切りは①始めの値、2番目の区切りは②最後の値-1まで繰り返し処理を行うことができます。

①1からはじめて③10まで繰り返した処理の結果が表示されました。

さらに、range()の中をカンマ3つ区切るとどうなるでしょうか。

最初の区切りは①始めの値、2番目の区切りは②最後の値-1、そして3番目の区切りは③飛ばす値を設定できます。つまり、①の値から始めて、③飛ばしで、②の値まで繰り返し処理を行うことができます。

①1からはじめて③2つ飛ばしで、③10まで繰り返した処理の結果が表示されました。

range()内len()を使用するケースもあります。

len()はその要素数を取得できるものです。今回はlist要素数である10を取り出して、それを一つずつ表示しています。ここで注意したいのは、先ほどのfor文のみで取り出した場合との違いです。

似ているようで違う結果が出ています。これはfor文だけの時は、1~10が入ったlist一つ一つ取り出しているので1~10が表示されていますが、len()を用いたときは、要素10個一つ一つ取り出しているだけなので、Pythonの最初の要素0から10個取り出されるので、0~9となります。

同じように1~10取り出したい場合には、i+1しましょう。

【len()とrange()を使って番号を1からふりたい時(リストに格納)】

list(range(1,len(i)+1))

上記の例を用いるとlen(i)となるが、iの部分にデータフレームを入れると、そのデータフレームの行数分、1から番号をふることができる

for文~zip関数~

複数のリスト同時に処理したい場合には、zip関数を用います。zip()内の引数にいれたリストの同じインデックス番号それぞれ取り出すという処理ができます。

今度はzip()を用いて、文字列として苗字名前を抜き出してみましょう。

ちなみに、print文内でつなげるとseimei間のスペースをなくすことができます。

for文~enumerate関数~

要素同時インデックス番号取得したい場合には、enumerate関数を使用します。

print内のiインデックス番号name1要素になりますこれをenumerate()の引数であるname1から一つずつ取り出して表示しています

for文~データ分析で実際に使われるような具体例~

for文と先ほど学んだif文range関数が混合した具体例を見てましょう。

データサイエンス100本ノック(構造化データ加工編)問42を用います。

データサイエンス100本ノック(構造化データ加工編)を知りたい方は下記のブログ記事を参考にしてください。
>>【Google Colabはじめ方】データサイエンス100本ノックーデータサイエンティスト協会

問42 レシート明細データフレーム(df_receipt)の売上金額(amount)を日付(sales_ymd)ごとに集計し、各日付のデータに対し、1日前、2日前、3日前のデータを結合せよ。

df_receiptの中身を見てみます。

df_receiptの売上金額(amount)を日付(sales_ymdごとに集計したものを、df_sales_amount_by_dateとします。

1日前2日前3日前のデータの作成に際しては、for文を使用します。

df_sales_amount_by_date日付順に並んでいますので、日付を一行ずつずらしたものを作成すれば、それは1日前のdf_sales_amount_by_dateとなります。つまり2日前のものは2行ずらしたもの、3日前のものは3行ずらしたものです。

そこでrange関数を用います。range(1,4)とすることでiには1,2,3が入ります。

for i in range(1,4):
    if i == 1:
        df_lag = pd.concat([df_sales_amount_by_date,df_sales_amount_by_date.shift(i)],axis=1)
    else:
        df_lag = pd.concat([df_lag,df_sales_amount_by_date.shift(i)],axis=1)

if文の中身を見てましょう!

i1の場合、先ほど作成したdf_sales_amount_by_date日付を一行ずらしたdf_sales_amount_by_date(つまり1日前df_sales_amount_by_date)を結合し、これをdf_lagとします。なお、結合には、pd.concat()を使用します。

それ以外(iが2,3)の場合には、先ほどのdf_lagとそれぞれ日付をi行(2行、3行)ずらしたdf_sales_amount_by_dateとを繰り返し結合します。 

これで、各日付のデータに対し、1日前、2日前、3日前のデータを結合できました。

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

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

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

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