宽表与长表

使用 pandas 重塑数据

Maria Eugenia Inzaugarat

Data Scientist

学习目标

  • 宽表与长表
  • 长转宽
  • 宽转长
  • 列的堆叠与解堆叠
  • 重塑与处理复杂数据,如字符串列或 JSON 数据
使用 pandas 重塑数据

重要性

  • 整洁数据集
  • 数据格式不利于分析:
    • 人类可读 vs. 统计分析
  • DataFrame 中的嵌套数据难以处理
  • 为多级索引 DataFrame 获取汇总统计
使用 pandas 重塑数据

数据形状(Shape)

  • 数据集在行与列上的组织方式
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
  • 每行表示一个特征
使用 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
        ^^^^^^^^^^^
  • 每行表示一个特征
  • 每名球员对应多行
  • 用一列(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
  • 每行表示一个特征
  • 每名球员对应多行
  • 用一列(name)标识同一球员
  • 整洁数据:
    • 更利于汇总
    • 键-值对
    • 更适合分析与作图
使用 pandas 重塑数据

数据重塑

  • 为分析重塑 DataFrame/Series 结构
    • 行列转置
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 结构
    • 行列转置
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 结构
    • 行列转置
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 重塑数据

Vamos praticar!

使用 pandas 重塑数据

Preparing Video For Download...