機械学習コンペティションを開催する Kaggle のサイトを見ていたら「Kaggle Courses」という「学習コンテンツ」が公開されていて,Python や SQL や 機械学習など様々なトピックを学べるようになっていた.なんと無料💰現時点でコースは「計17種類」もある.今回は今まで何となく使っていた「Pandas」を学ぶコースを受講してみた.Pandas 未経験者や Pandas の基本的な機能を一通り学びたい人におすすめ👌
アジェンダ 📊
Pandas コースは「計6個」のレッスンから構成されていて,Pandas の基礎(DataFrame と Series)から,Pandas でのデータ取得や欠損値の取り扱いまで幅広く学べる.そして,一歩一歩「歩幅を小さく」学べるため,理解できずに挫折することなく進められる点も素晴らしい!
- Creating, Reading and Writing
- Indexing, Selecting & Assigning
- Summary Functions and Maps
- Grouping and Sorting
- Data Types and Missing Values
- Renaming and Combining
「Kaggle Courses」のレッスンには大きく「2種類」の学習コンテンツがある.まずは「Tutorial」で Notebook を読みながら機能を学べる(座学的な).次に「Exercise」で Notebook に実際にコードを実装しながら学ぶ(演習的な).特に「Exercise」ではすぐにコードを実装できるわけではなく,ドキュメントを調べたりもするため,理解を深められる仕組みになっていると思う.また以下のような便利機能も組み込まれているため,答え合わせをしたり,ヒントを確認できたりもする.便利!
q1.check() q1.hint() q1.solution()
1. Creating, Reading and Writing 📊
最初は Pandas の代表的なオブジェクトとして DataFrame と Series の操作から学ぶ.それぞれのコンストラクタに Python の dict
を指定してオブジェクトを作ったり,index
パラメータを指定したりする.コンストラクタ経由でオブジェクトを作れるのはサクッと試すには便利だけど,実用的ではなく,多くの場面ではデータファイルを扱うため,次のトピックに繋がる.
pd.DataFrame({'Yes': [50, 21], 'No': [131, 2]}) pd.DataFrame({'Bob': ['I liked it.', 'It was awful.'], 'Sue': ['Pretty good.', 'Bland.']}) pd.DataFrame({'Bob': ['I liked it.', 'It was awful.'], 'Sue': ['Pretty good.', 'Bland.']}, index=['Product A', 'Product B'])
次に read_csv()
関数を使ってデータファイルを読み込む.read_csv()
関数には多くのパラメータが実装されているけど,今回は index_col
パラメータを使って DataFrame の行ラベルを指定している.また読み込んだデータを head()
関数で表示したり,to_csv()
関数でエクスポートしたりする.
reviews = pd.read_csv('../input/wine-reviews/winemag-data_first150k.csv', index_col=0) animals = pd.DataFrame({'Cows': [12, 20], 'Goats': [22, 19]}, index=['Year 1', 'Year 2']) animals.to_csv('cows_and_goats.csv')
- pandas.read_csv — pandas 1.2.3 documentation
- pandas.DataFrame.head — pandas 1.2.3 documentation
- pandas.DataFrame.to_csv — pandas 1.2.3 documentation
2. Indexing, Selecting & Assigning 📊
次に Pandas でデータを取得するテクニックを学ぶ.Pandas では Python の構文と同じようにデータを取得することができるため,簡単ではあるけど,Pandas では iloc()
関数(行と列をインデックスで指定する)や loc()
関数(行と列をラベルで指定する)を使う.例えば loc()
関数を条件を組み合わせるとデータに対して AND (&)
や OR (|)
を使うこともできる.他にも isin()
関数を条件に使った例なども学べる.便利!
reviews.iloc[0] reviews.iloc[:, 0] reviews.iloc[1:3, 0] reviews.loc[0, 'country'] reviews.loc[:, ['taster_name', 'taster_twitter_handle', 'points']] reviews.loc[reviews.country == 'Italy'] reviews.loc[(reviews.country == 'Italy') & (reviews.points >= 90)] reviews.loc[(reviews.country == 'Italy') | (reviews.points >= 90)] reviews.loc[reviews.country.isin(['Italy', 'France'])]
- pandas.DataFrame.loc — pandas 1.2.3 documentation
- pandas.DataFrame.iloc — pandas 1.2.3 documentation
- pandas.DataFrame.isin — pandas 1.2.3 documentation
3. Summary Functions and Maps 📊
実際に Pandas でデータを扱う場合,単に取得するだけではなく,サマリを取得したり値を変換したりする場面もある.今度はサマリ関数を学ぶ.例えば describe()
関数を使って最小値や最大値やパーセンタイルをまとめて取得したり,min()
関数や max()
関数を使って個別に取得することもできる.他にも平均値や中央値や標準偏差なども取得できる.SQL のイメージと似ている.
reviews.describe() # points price # count 129971.000000 120975.000000 # mean 88.447138 35.363389 # std 3.039730 41.022218 # min 80.000000 4.000000 # 25% 86.000000 17.000000 # 50% 88.000000 25.000000 # 75% 91.000000 42.000000 # max 100.000000 3300.000000 reviews.price.describe() # count 120975.000000 # mean 35.363389 # std 41.022218 # min 4.000000 # 25% 17.000000 # 50% 25.000000 # 75% 42.000000 # max 3300.000000 # Name: price, dtype: float64
- pandas.DataFrame.describe — pandas 1.2.3 documentation
- pandas.Series.describe — pandas 1.2.3 documentation
- pandas.Series.min — pandas 1.2.3 documentation
- pandas.Series.max — pandas 1.2.3 documentation
後半では map()
関数と apply()
関数を使ってデータを変換する.map()
関数は,Series から取得した単一の値を変換する場合などに使って,apply()
関数は,より広範囲に DataFrame 全体の値を変換する場合などに使う.ここまで学ぶと,データをうまく扱えているような気分になってくる!
reviews.points.map(lambda p: p - review_points_mean) reviews.apply(remean_points, axis='columns')
4. Grouping and Sorting 📊
今度は groupby()
関数を使って値をグループ化して集計する.以下のように「ポイント値」ごとにカウントしたり,「ポイント値」ごとに「値段」の最小値を取得したりできる.また agg()
関数と組み合わせてデータセットのサマリ情報を取得することもできる.
reviews.groupby('points').points.count() # points # 80 397 # 81 692 # ... # 99 33 # 100 19 # Name: points, Length: 21, dtype: int64 reviews.groupby('points').price.min() reviews.groupby(['country']).price.agg([len, min, max])
- pandas.DataFrame.groupby — pandas 1.2.3 documentation
- pandas.Series.agg — pandas 1.2.3 documentation
同じく SQL のイメージと似ていて,データをソートすることもできる.DataFrame や Series に対して sort_values()
関数を使う.
countries_reviewed.sort_values(by='len') countries_reviewed.sort_values(by='len', ascending=False)
- pandas.DataFrame.sort_values — pandas 1.2.3 documentation
- pandas.Series.sort_values — pandas 1.2.3 documentation
5. Data Types and Missing Values 📊
今度は Pandas で扱う DataFrame や Series の「データ型」を学ぶ.Pandas では dtype
プロパティで Pandas が解釈をした「型」を取得できる.以下は DataFrame のカラムごとに型を取得している.
reviews.points.dtype # int64 reviews.country.dtype # object
また astype()
関数を使うと,型を変換できる.以下は「ポイント値」を int64 から float64 に型変換している.
reviews.points # 0 87 # 1 87 # 2 87 # 3 87 # 4 87 # .. # 129966 90 # 129967 90 # 129968 90 # 129969 90 # 129970 90 # Name: points, Length: 129971, dtype: int64 reviews.points.astype('float64') # 0 87.0 # 1 87.0 # 2 87.0 # 3 87.0 # 4 87.0 # ... # 129966 90.0 # 129967 90.0 # 129968 90.0 # 129969 90.0 # 129970 90.0 # Name: points, Length: 129971, dtype: float64
- pandas.DataFrame.dtypes — pandas 1.2.3 documentation
- pandas.Series.dtypes — pandas 1.2.3 documentation
- pandas.DataFrame.astype — pandas 1.2.3 documentation
後半では「欠損値 (Missing data) : NaN」の取り扱いを学ぶ.データセットはキレイに揃ったデータばかりではないため,Pandas では NaN を取り扱う関数が多く用意されている.例えば isnull()
や notnull()
や isna()
や notna()
や fillna()
など.
reviews.region_2.fillna("Unknown")
- pandas.isnull — pandas 1.2.3 documentation
- pandas.notnull — pandas 1.2.3 documentation
- pandas.isna — pandas 1.2.3 documentation
- pandas.notna — pandas 1.2.3 documentation
- pandas.Series.fillna — pandas 1.2.3 documentation
6. Renaming and Combining 📊
最後はデータセットの名前を変更したり,複数の DataFrame を結合したり,現場で使えそうなテクニックを学ぶ.まず,DataFrame に対して rename()
関数を使ってカラム名やインデックス名を変更する.ただし,インデックス名を変更する場面は少ないとも書いてあった.
reviews.rename(columns={'points': 'score'}) reviews.rename(index={0: 'firstEntry', 1: 'secondEntry'})
そして,複数の DataFrame を結合するために concat()
関数(データセットをシンプルに結合)と join()
関数(right
や inner
など軸を指定して結合)と merge()
関数(right
や inner
など軸を指定して結合)を学ぶ.なお,1番複雑な merge()
関数で実行できることはほとんど join()
関数で実行できるため,Pandas コースでは merge()
関数は割愛されていた.それぞれに細かくプロパティがあるため,あくまで基本的な操作を試すところまでを学べる.
canadian_youtube = pd.read_csv("../input/youtube-new/CAvideos.csv") british_youtube = pd.read_csv("../input/youtube-new/GBvideos.csv") pd.concat([canadian_youtube, british_youtube]) left = canadian_youtube.set_index(['title', 'trending_date']) right = british_youtube.set_index(['title', 'trending_date']) left.join(right, lsuffix='_CAN', rsuffix='_UK')
- pandas.concat — pandas 1.2.3 documentation
- pandas.DataFrame.join — pandas 1.2.3 documentation
- pandas.merge — pandas 1.2.3 documentation
まとめ 📊
「Kaggle Courses」で Pandas コースを受講してみた.わかりやすく歩幅も小さく学べて素晴らしい学習体験だった.さすが Kaggle👏 Pandas の基本的な機能を一通り学べるため,未経験者にもおすすめできる.なお,最後までレッスンを受講すると証明書も取得できるため,モチベーションを刺激する仕組みになっていた!
最近は Pandas の機能をより深く学ぶため,並行して「Pandas ライブラリ活用入門」を読んでいる.読み終わったら書評記事を書く予定.今回紹介した Pandas コースよりも詳しくまとまっているため,興味があれば読んでみると良いかと📖

Pythonデータ分析/機械学習のための基本コーディング! pandasライブラリ活用入門 impress top gearシリーズ
- 作者:Daniel Y. Chen,吉川 邦夫,福島 真太朗
- 発売日: 2019/02/22
- メディア: Kindle版