Pythonでデータセットから別のデータセットへピボットテーブルを作成する

スポンサーリンク

大規模なデータセットから、一部のデータのみについて素早く洞察を得たい場合があります。

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()
Screenshot 374

では、ピボットテーブルの作成を開始します。

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()
Screenshot 376

Pythonでピボットテーブルからデータを選択・フィルタリングする#######Pythonでピボットテーブルからデータを選択・フィルタリングする

ここで、配列の総数が30000以上のvariantを調べたい場合、以下のようなコマンドを渡します。

total_by_variant[total_by_variant['num_sequences'] > 30000]
Screenshot 378

ここでもう一度、30000から70000の間の配列数しかない variant を見たいとします。

この場合、次のようなコマンドを実行します。

total_by_variant[(total_by_variant['num_sequences'] > 30000) | (total_by_variant['num_sequences'] < 70000)]
Screenshot 380

では、マルチインデックス・ピボットテーブルの学習に入りましょう。

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')
Image 7

このプロットは非常に不格好ですが、いつも言っているように、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引数を渡せばよいでしょう。

おわりに

今回は、与えられたデータセットからピボットテーブルを生成し、別のデータフレームに変換する方法について学びました。

ピボットテーブルは、多数の特徴量や変数を持つデータセットを分析するときに、本当に便利です。

上記のピボットテーブルの関数をすべて暗記すれば、データ分析プロジェクトで大いに役立ちます。

タイトルとURLをコピーしました