Pandas05--变形

这篇博客介绍了Pandas库中用于数据变形的方法,包括pivot将长表转为宽表,pivot_table进行复杂的数据聚合和变形,melt将宽表转为长表,以及wide_to_long用于多级索引的宽表变形。内容涵盖了各种变形函数的使用条件、参数解析和实例演示,帮助理解如何在不同数据形态间转换。
摘要由CSDN通过智能技术生成


1 长宽表的变形

  • 长表和宽表:这个概念是对于某一个特征而言的。比如,一个表中把性别存储在某一个列中,那么它就是关于性别的长表;如果把性别作为列名,列中的元素是某一其他的相关特征数值,那么这个表是关于性别的宽表。
    # 关于性别的长表
    pd.DataFrame({
         'Gender':['F','F','M','M'],
                  'Height':[163, 160, 175, 180]})
    '''
      Gender  Height
    0      F     163
    1      F     160
    2      M     175
    3      M     180
    '''
    # 关于性别的宽表
    pd.DataFrame({
         'Height: F':[163, 160],
                  'Height: M':[175, 180]})
    '''
       Height: F  Height: M
    0        163        175
    1        160        180
    '''              
    
  • 分析:这两张表从信息上是完全等价的,它们包含相同的身高统计数值,只是这些数值的呈现方式不同,而其呈现方式主要又与性别一列选择的布局模式有关,即到底是以long 的状态存储还是以wide的状态存储。

1.1 pivot

  • 作用:pivot是一种典型的长表变宽表的函数
  • 三要素:对于长变宽的操作,重要的是变形后的行索引、需要转到列索引的列,以及这些列和行索引对应的数值,分别对应 pivot方法中的index, columns, values参数
    • columns:新生成表的列索引是 columns对应列的unique
    • index:新表的行索引是 index对应列的unique
    • valuesvalues对应了想要展示的数值列
  • 【例子】把语文和数学分数作为列来展示
    '''
    原表:
       Class       Name  Subject  Grade
    0      1  San Zhang  Chinese     80
    1      1  San Zhang     Math     75
    2      2      Si Li  Chinese     90
    3      2      Si Li     Math     85
    '''
    # 变形
    df.pivot(index='Name', columns='Subject', values='Grade')
    '''
    Subject    Chinese  Math
    Name                    
    San Zhang       80    75
    Si Li           90    85
    '''
    
    • 变形过程:
      在这里插入图片描述
  • 要满足的要求:pivot函数进行变形操作需要满足唯一性的要求,即原表中的 indexcolumns 对应两个列的行组合必须唯一,因为在新表中的行列索引对应了唯一的value
    • 【例子】 :如果把原表中第二行张三的数学改为语文就会报错,这是由于NameSubject的组合中两次出现 (“San Zhang”, “Chinese”) ,从而最后不能够确定到底变形后应该是填写80分还是75分。
  • 参数为列表: pivot 相关的三个参数允许被设置为列表,结果就会返回多级索引
    • 【例子】:把测试类型和科目联合组成的四个类别(期中语文、期末语文、期中数学、期末数学)转到列索引,并且同时统计成绩和排名:
    '''
    原表:
       Class       Name Examination  Subject  Grade  rank
    0      1  San Zhang         Mid  Chinese     80    10
    1      1  San Zhang       Final  Chinese     75    15
    2      2      Si Li         Mid  Chinese     85    21
    3      2      Si Li       Final  Chinese     65    15
    4      1  San Zhang         Mid     Math     90    20
    5      1  San Zhang       Final     Math     85     7
    6      2      Si Li         Mid     Math     92     6
    7      2      Si Li       Final     Math     88     2
    '''
    pivot_multi = df.pivot(index = ['Class', 'Name'],
                           columns = ['Subject','Examination'],
                           values = ['Grade','rank'])
    pivot_multi                       
    '''
                      Grade                     rank                 
    Subject         Chinese       Math       Chinese       Math      
    Examination         Mid Final  Mid Final     Mid Final  Mid Final
    Class Name                                                       
    1     San Zhang      80    75   90    85      10    15   20     7
    2     Si Li          85    65   92    88      21    15    6     2
    '''                      
    
    • 分析:根据唯一性原则,新表的行索引等价于对index 中的多列使用 drop_duplicates ,而列索引的长度为 values 中的元素个数乘以columns 的唯一组合数量(与 index 类似) 。

    !!这段重新看!!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值