大規模なデータセットから、一部のデータのみについて素早く洞察を得たい場合があります。
Pythonのピボットテーブルはそんな時に便利で、必要なデータを抽出し、新しいデータから洞察を生み出すのに役立ちます。
今日は、Pandasにあるピボットテーブルの関数を使用します。
この記事では、Pythonであるデータセットを別のデータセットにピボットテーブルする方法について、包括的な概要を説明します。
こちらもご覧ください。
ピボットテーブルとは何ですか?ピボットテーブルを作るには?
ピボットテーブルとは、より大きなテーブルやデータセットからデータを抽出するのに役立つテーブルです。
言い換えれば、より大きなデータセットからデータを「ピボット」するのです。
ここでは、ピボットテーブルの構文について説明します。
pandas.pivot_table(data, values = None , index = None , columns = None , aggfunc = 'mean' , fill_value = None )
|
ピボット・テーブル関数は、データフレームを返します。
ピボットテーブルの基本がわかったところで、さっそくピボットしてみましょう。
データセットの読み込み
まず、データセットを環境にロードします。
import pandas as pd
df = pd.read_csv( "C://Users//Intel//Documents//covid-variants.csv" )
df.head() |
では、ピボットテーブルの作成を開始します。
Pythonでピボットテーブルを生成する ### Pythonでピボットテーブルを生成する
num_sequences_by_variant = pd.pivot_table(df, index = 'variant' , values = 'num_sequences' ,aggfunc = 'mean' )
print (num_sequences_by_variant)
|
num_sequences
variant Alpha 270.696702
B. 1.1 . 277 0.282744
B. 1.1 . 302 0.116157
B. 1.1 . 519 5.455306
B. 1.160 8.130736
B. 1.177 40.740201
B. 1.221 3.675191
B. 1.258 7.358270
B. 1.367 0.229685
B. 1.620 0.242830
Beta 9.683078
Delta 916.371893
Epsilon 15.804732
Eta 1.654876
Gamma 27.522945
Iota 10.254541
Kappa 1.787046
Lambda 2.249283
Mu 3.405354
Omicron 27.614245
S: 677H .Robin1 1.564771
S: 677P .Pelican 1.156071
non_who 222.537763
others 153.585803
|
ご覧のように、num_sequencesとvariantsという変数でピボットテーブルを作成しました。
平均値としてaggfunc関数を渡しているので、実際にはnum_sequencesは全てのnum_sequencesの平均値となります。
もし、全てのnum_sequencesの合計が欲しい場合は、aggfuncパラメータにsumを渡せば良い。
total_by_variant = pd.pivot_table(df, index = 'variant' , values = 'num_sequences' ,aggfunc = 'sum' )
print (total_by_variant)
|
出力
出力
num_sequences
variant Alpha 1132595
B. 1.1 . 277 1183
B. 1.1 . 302 486
B. 1.1 . 519 22825
B. 1.160 34019
B. 1.177 170457
B. 1.221 15377
B. 1.258 30787
B. 1.367 961
B. 1.620 1016
Beta 40514
Delta 3834100
Epsilon 66127
Eta 6924
Gamma 115156
Iota 42905
Kappa 7477
Lambda 9411
Mu 14248
Omicron 115538
S: 677H .Robin1 6547
S: 677P .Pelican 4837
non_who 931098
others 642603
|
Pythonでピボットテーブルのインデックスを設定する方法
上記のデータフレームのインデックスをリセットするには、以下のコマンドを使用すると非常に簡単です。
num_sequences_by_variant.reset_index() |
Pythonでピボットテーブルからデータを選択・フィルタリングする#######Pythonでピボットテーブルからデータを選択・フィルタリングする
ここで、配列の総数が30000以上のvariantを調べたい場合、以下のようなコマンドを渡します。
total_by_variant[total_by_variant[ 'num_sequences' ] > 30000 ]
|
ここでもう一度、30000から70000の間の配列数しかない variant を見たいとします。
この場合、次のようなコマンドを実行します。
total_by_variant[(total_by_variant[ 'num_sequences' ] > 30000 ) | (total_by_variant[ 'num_sequences' ] < 70000 )]
|
では、マルチインデックス・ピボットテーブルの学習に入りましょう。
Pythonで作るマルチインデックス・ピボットテーブル
これまで、1つのインデックスを持つピボットテーブルについてだけ学んできました。
しかし、複数のインデックスを持つピボットテーブルを作成することもでき、データからより多くの洞察を得ることができます。
以下の表では、バリアントタイプと日付をインデックスとして設定しています。
multi_index_table = pd.pivot_table(df, index = [ 'variant' , 'date' ], values = 'num_sequences' , aggfunc = 'sum' )
print (multi_index_table)
|
出力
num_sequences
variant date Alpha 2020 - 05 - 11 0
2020 - 05 - 25 0
2020 - 06 - 08 0
2020 - 06 - 22 0
2020 - 07 - 06 0
... ... others 2021 - 11 - 15 928
2021 - 11 - 29 928
2021 - 12 - 13 619
2021 - 12 - 27 603
2022 - 01 - 05 2
[ 1080 rows x 1 columns]
|
多機能なマルチインデックス・ピボットテーブル
複数のインデックスを設定する以外に、ピボットテーブルのaggfuncパラメータに複数の関数を設定することができます。
例えば、以下のようになります。
multi_functions_table = pd.pivot_table(df, index = [ 'variant' , 'date' ], values = 'num_sequences' , aggfunc = [ 'sum' , len ])
print (multi_functions_table)
|
出力
出力
sum len
num_sequences num_sequences
variant date Alpha 2020 - 05 - 11 0 78
2020 - 05 - 25 0 72
2020 - 06 - 08 0 78
2020 - 06 - 22 0 79
2020 - 07 - 06 0 74
... ... ... others 2021 - 11 - 15 928 89
2021 - 11 - 29 928 85
2021 - 12 - 13 619 86
2021 - 12 - 27 603 64
2022 - 01 - 05 2 12
[ 1080 rows x 2 columns]
|
Pythonでピボットテーブルに新しいカラムを追加する
このステップでは、バリアントフィーチャーをカラムとして追加し、インデックスとして日付を設定します。
これにより、データがより整理され、読みやすくなります。
参考
add_columns = pd.pivot_table(df, index = 'date' , columns = 'variant' , values = 'num_sequences' , aggfunc = 'sum' )
print (add_columns)
|
出力
出力
variant Alpha B. 1.1 . 277 B. 1.1 . 302 B. 1.1 . 519 B. 1.160 B. 1.177
date 2020 - 05 - 11 0 0 0 0 0 2 2020 - 05 - 25 0 0 0 0 0 0 2020 - 06 - 08 0 0 0 0 0 2 2020 - 06 - 22 0 0 0 0 0 8 2020 - 07 - 06 0 0 0 0 0 72 2020 - 07 - 20 0 7 3 0 8 88 2020 - 08 - 03 0 12 8 0 22 172 2020 - 08 - 17 0 43 12 0 89 499 2020 - 08 - 31 0 94 24 0 386 1400 2020 - 09 - 14 0 143 32 0 1017 2923 2020 - 09 - 28 3 178 27 0 1049 6225 2020 - 10 - 12 15 120 31 0 1188 8693 2020 - 10 - 26 47 155 21 1 2017 13008 2020 - 11 - 09 381 180 21 5 2773 15723 2020 - 11 - 23 1450 72 27 17 2274 15622 2020 - 12 - 07 1128 42 29 34 2029 10489 2020 - 12 - 21 9061 28 42 82 3110 19350 2021 - 01 - 04 14002 29 21 184 2934 14161 |
Pythonでピボットテーブルを可視化する
このセクションでは、テーブルの棒グラフを作成します。
これにより、データをより明確に視覚化することができます。
表
add_columns.plot(kind = 'bar' )
|
このプロットは非常に不格好ですが、いつも言っているように、PythonのmatplotlibライブラリやSeabornライブラリを使って、プロットをより見栄えの良いものにすることができます。
Handling with missing values
このセクションでは、ピボット・テーブルのデータで欠損値を処理する方法について説明します。
まず、データセットに欠損値が存在するかどうかを確認します。
print (df.info())
|
< class 'pandas.core.frame.DataFrame' >
RangeIndex: 100416 entries, 0 to 100415
Data columns (total 6 columns):
# Column Non-Null Count Dtype
- - - - - - - - - - - - - - - - - - - - - - - - - - - - 0 location 100416 non - null object
1 date 100416 non - null object
2 variant 100416 non - null object
3 num_sequences 100416 non - null int64
4 perc_sequences 100416 non - null float64
5 num_sequences_total 100416 non - null int64
dtypes: float64( 1 ), int64( 2 ), object ( 3 )
memory usage: 4.6 + MB
None |
このように、データセットには欠損値が存在しないので、データに対して何もする必要はありません。
万が一、データに欠損値がある場合は、ピボットテーブル関数のN/Aとしてfill_value引数を渡せばよいでしょう。
おわりに
今回は、与えられたデータセットからピボットテーブルを生成し、別のデータフレームに変換する方法について学びました。
ピボットテーブルは、多数の特徴量や変数を持つデータセットを分析するときに、本当に便利です。
上記のピボットテーブルの関数をすべて暗記すれば、データ分析プロジェクトで大いに役立ちます。