ワイド形式とロング形式

pandas でデータを整形する

Maria Eugenia Inzaugarat

Data Scientist

学習内容

  • ワイド形式とロング形式
  • ロング→ワイド変換
  • ワイド→ロング変換
  • 列のスタック/アンスタック
  • 文字列列やJSONなどの複雑データの整形
pandas でデータを整形する

重要な理由

  • tidyデータセット
  • 解析に不向きな形式のデータ:
    • 人間が読みやすい形式 vs. 統計解析向け
  • DataFrame内の入れ子データは扱いが難しい
  • 多段インデックスの要約統計を取得
pandas でデータを整形する

データの形状

  • データセットの行・列の構成
fifa_players = pd.read_csv("fifa_players.csv")
fifa_players
                name    age   nationality           club
0       Lionel Messi     32     Argentina      Barcelona
1  Cristiano Ronaldo     34      Portugal       Juventus
2    Neymar da Silva     27        Brazil  Saint-Germain
fifa_players.shape
(3, 4)
pandas でデータを整形する

ワイド形式

fifa_players

                name    age   nationality           club
0       Lionel Messi     32     Argentina      Barcelona
1  Cristiano Ronaldo     34      Portugal       Juventus
2    Neymar da Silva     27        Brazil  Saint-Germain

pandas でデータを整形する

ワイド形式

fifa_players
                         vv  
                name   | age | nationality          club
0       Lionel Messi   | 32  |  Argentina      Barcelona
1  Cristiano Ronaldo   | 34  |   Portugal       Juventus
2    Neymar da Silva   | 27  |     Brazil  Saint-Germain
                         ^^
  • 各特徴量が別々の列にある
pandas でデータを整形する

ワイド形式

fifa_players

                name    age   nationality           club
0       Lionel Messi     32     Argentina      Barcelona <--
1  Cristiano Ronaldo     34      Portugal       Juventus <--
2    Neymar da Silva     27        Brazil  Saint-Germain <--

  • 各特徴量が別々の列にある
  • 各行は同一選手の複数の特徴量を含む
pandas でデータを整形する

ワイド形式

fifa_players
                name    age   nationality           club
0       Lionel Messi     32     Argentina      Barcelona
 --------------------------------------------------------
1    Cristiano Ronaldo    NaN  <-    Portugal       Juventus
 --------------------------------------------------------
2    Neymar da Silva     27        Brazil  Saint-Germain
  • 各特徴量が別々の列にある
  • 各行は同一選手の複数の特徴量を含む
  • 重複なしだが欠損が多い
  • 単純な統計と補完に適する
pandas でデータを整形する

ロング形式

fifa_players_long.head()
               name     variable     value
0 Cristiano Ronaldo  nationality   Portugal 
1 Cristiano Ronaldo         club   Juventus 
2      Lionel Messi          age         32
3      Lionel Messi  nationality  Argentina 
4      Lionel Messi         club  Barcelona
pandas でデータを整形する

ロング形式

fifa_players_long.head()
               name     variable     value
0   Cristiano Ronaldo  nationality   Portugal <--
1 Cristiano Ronaldo         club  Juventus 
2      Lionel Messi          age        32
3        Lionel Messi  nationality  Argentina <--
4      Lionel Messi         club  Barcelona
  • 各行が1つの特徴量を表す
pandas でデータを整形する

ロング形式

fifa_players_long.head()
               name     variable     value
0   Cristiano Ronaldo  nationality   Portugal <--
1   Cristiano Ronaldo         club   Juventus <--
2      Lionel Messi          age         32
3      Lionel Messi  nationality  Argentina 
4      Lionel Messi         club  Barcelona
  • 各行が1つの特徴量を表す
  • 各選手につき複数行
pandas でデータを整形する

ロング形式

fifa_players_long.head()
  |              name |    variable      value
0 | Cristiano Ronaldo | nationality   Portugal
1 | Cristiano Ronaldo |        club   Juventus
2 |      Lionel Messi |         age         32
3 |      Lionel Messi | nationality  Argentina 
4 |      Lionel Messi |        club  Barcelona
        ^^^^^^^^^^^
  • 各行が1つの特徴量を表す
  • 各選手につき複数行
  • 同一選手を識別する列(name)がある
pandas でデータを整形する

ロング形式

fifa_players_long.head()
               name     variable     value
0 Cristiano Ronaldo  nationality   Portugal 
1 Cristiano Ronaldo         club   Juventus 
2      Lionel Messi          age         32
3      Lionel Messi  nationality  Argentina 
4      Lionel Messi         club  Barcelona
  • 各行が1つの特徴量を表す
  • 各選手につき複数行
  • 同一選手を識別する列(name)がある
  • tidyデータ:
    • 要約がしやすい
    • キーと値の組
    • 解析・可視化に好適
pandas でデータを整形する

データの整形

  • 解析に合わせてDataFrame/Seriesの構造を変形
    • DataFrameを転置
fifa_players.set_index('club')
                             name  age  nationality
         club 
    Barcelona        Lionel Messi   32    Argentina
     Juventus   Cristiano Ronaldo  NaN     Portugal
Saint-Germain     Neymar da Silva   27       Brazil
pandas でデータを整形する

データの整形

  • 解析に合わせてDataFrame/Seriesの構造を変形
    • DataFrameを転置
fifa_players.set_index('club')[['name', 'nationality']]
                               name   nationality 
         club 
    Barcelona        Lionel Messi       Argentina
     Juventus   Cristiano Ronaldo        Portugal
Saint-Germain     Neymar da Silva          Brazil
pandas でデータを整形する

データの整形

  • 解析に合わせてDataFrame/Seriesの構造を変形
    • DataFrameを転置
fifa_players.set_index('club')[['name', 'nationality']].transpose()
       club         Barcelona           Juventus     Saint-Germain
       name      Lionel Messi  Cristiano Ronaldo   Neymar da Silva
nationality         Argentina           Portugal            Brazil
pandas でデータを整形する

データの整形

  • ワイド⇄ロングの変換
  • 分析単位:
    • ロング形式 -> 選手の特性
    • ワイド形式 -> 各選手
pandas でデータを整形する

ワイド→ロング変換

  • pandasの関数で実施:

    • .melt()
    • .wide_to_long()
pandas でデータを整形する

ロング→ワイド変換

  • pandasのメソッドで変換:

    • .pivot()
    • .pivot_table()
pandas でデータを整形する

Ayo berlatih!

pandas でデータを整形する

Preparing Video For Download...