
はじめに
データ分析・データサイエンスの初心者・初学者に最初に覚えて欲しいPythonの構文がいくつかあります。
今回はその中の一つである、データ分析でよく使うPython構文であるfor文、range関数、zip関数、enumerate関数を紹介します。
このブログでは、①基本をしっかりと示し、②実際のデータ分析でどのように使われるかという具体例を紹介します!
読み終えたあとには、しっかりとその構文が身についていると思います。
for文~基本~
for文とは、リストから一つずつデータを取り出して、繰り返し処理を行える文です。
簡単なものを、googlecolobで動かしてみます。
Google Colaboratoryについては知りたい方は、以下のブログ記事を参考にしてください。
>>Google Colaboratoryとは? いつできた? mount、ファイルの読み込み等の使い方
>>Google Colaboratoryよく使う便利なショートカットキー
それでは、はじめましょう!!
例えば、listに1,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文の中身を見てましょう!
iが1の場合、先ほど作成した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日前のデータを結合できました。
データ分析入門・データサイエンス初心者・初学者向けにデータ分析でよく使うPython構文やPandasをまとめました。
>>【データ分析初心者】Python構文~if文、format記法とf文字列~
>>【データ分析初心者】Python構文~無名関数lambda式、内包表記、map関数~
>>【データ分析初心者】Pandas~loc[]、iloc[]、スライス、drop()、isin()~
>>【データ分析初心者】Matplotlib、Seabornーscatter()、hist()、countplot() 、barplot()
>>【データ分析初心者】Pythonを使って、和暦から西暦への変換を行う
書籍や動画でデータ分析を学びたい方へ
機械学習やデータサイエンスを独学で学びたい方のために、ブログ記事をまとめてみました。
書籍、動画などなど、厳選したオススメの方法をまとめています。
興味がある方はご覧ください。
