zoukankan      html  css  js  c++  java
  • Task 4 透视表

    一、透视表

    pivot函数、pivot_table函数

    一般状态下,数据在DataFrame会以压缩(stacked)状态存放,例如上面的Gender,两个类别被叠在一列中。pivot_table函数可将某一原列转为新列,新列中的值由其他列确定。请体会pivot_table函数中参数的作用:

    df.pivot(index='ID',columns='Gender',values='Height').head()
    # 将columns的值展开,填入指定的values
    pd.pivot_table(df, index='ID',columns='Gender',values='Height').head()
    

    image-20200428210706298

    其他一些常用的参数:

    • aggfunc:对组内进行聚合统计,默认统计函数为mean
    • margins = True:汇总边际状态
    pd.pivot_table(df,index='School',columns='Gender',values='Height',aggfunc=['mean','sum'], margins=True).head()
    # 默认 margins_name='All'
    

    image-20200428211037540

    • 设置行、列、值为多级
    pd.pivot_table(df,index=['School','Class'],
                  columns=['Gender','Address'],
                  values=['Height','Weight'])
    

    image-20200428211145875

    crosstab函数(交叉表)

    交叉表是一种特殊的透视表,典型的用途如分组统计。下面统计街道和性别分组的频数:

    pd.crosstab(index=df['Address'], columns=df['Gender'])
    

    image-20200428212634037

    crosstab函数的一些重要参数:

    • values和aggfunc:分组对某些数据进行聚合操作,这两个参数必须成对出现
    pd.crosstab(index=df['Address'],columns=df['Gender'],
                values=np.random.randint(1,20,df.shape[0]),aggfunc='min')
    #默认参数等于如下方法:
    #pd.crosstab(index=df['Address'],columns=df['Gender'],values=1,aggfunc='count')
    

    交叉表的默认函数中,默认为计数方法,此处实验采用的min方法,相信你可以比较出他们的不同,以及理解values和aggfunc成对出现的原因:

    image-20200428213115852

    • normalize参数,可选'all','index','columns'参数值。

    normalize与margins也是成对出现的,归一化的值需要在边际上呈现。

    pd.crosstab(index=df['Address'], columns=df['Gender'],normalize='all',margins=True,margins_name='归一化')
    

    image-20200428213450957

    二、其他变形方法

    melt函数

    melt函数可以认为是pivot函数的逆操作,将unstacked状态的数据,压缩成stacked,使“宽”的DataFrame变“窄”。melt中的参数变量id_vars表示需要保留的列,value_vars表示需要stack的一组列。

    # 展开Gender这一列,并将Math列中的值赋给新列
    pivoted = df.pivot(index='ID',columns='Gender',values='Math')
    
    # 保留ID列,合并F、M列为一列,value_vars设置,然后去除空值列...
    result = pivoted.reset_index().melt(id_vars=['ID'],value_vars=['F','M'],value_name='新Math').dropna().set_index('ID').sort_index()
    
    display(result.head())、
    
    #检验是否与展开前的df相同,可以分别将这些链式方法的中间步骤展开,看看是什么结果
    # result.equals(df_m.set_index('ID'))
    

    压缩与展开

    (1)stack:这是最基础的变形函数,总共只有两个参数:level和dropna

    stack函数可以看做将横向的索引放到纵向,因此功能类似与melt,参数level可指定变化的列索引是哪一层(或哪几层,需要列表)

    (2) unstack:stack的逆函数,功能上类似于pivot_table

    三、哑变量与因子化

    Dummy Variable(哑变量)

    get_dummies函数的功能主要是进行one-hot编码。接下来,将Class、Gender变量转化为哑变量,并加入第三列Weight的数值:

    df_d = df[['Class','Gender','Weight']]
    pd.get_dummies(df_d[['Class','Gender']]).join(df_d['Weight']).head()
    # 可选prefix参数添加前缀,prefix_sep添加分隔符
    

    image-20200428220246517

    factorize方法

    factorize方法主要用于自然数编码,缺失值被记为-1,sort参数表示是否排序后赋值:

    codes, uniques = pd.factorize(['b', None, 'a', 'c', 'b'], sort=True)
    display(codes)
    display(uniques)
    
    array([ 1, -1,  0,  2,  1])
    array(['a', 'b', 'c'], dtype=object)
    

    四、问题与练习

    【问题一】 上面提到了许多变形函数,如melt/crosstab/pivot/pivot_table/stack/unstack函数,请总结它们各自的使用特点。
    【问题二】 变形函数和多级索引是什么关系?哪些变形函数会使得索引维数变化?具体如何变化?
    【问题三】 请举出一个除了上文提过的关于哑变量方法的例子。
    【问题四】 使用完stack后立即使用unstack一定能保证变化结果与原始表完全一致吗?
    【问题五】 透视表中涉及了三个函数,请分别使用它们完成相同的目标(任务自定)并比较哪个速度最快。
    【问题六】 既然melt起到了stack的功能,为什么再设计stack函数?

    【练习一】 继续使用上一章的药物数据集:

  • 相关阅读:
    智器SmartQ T7实体店试用体验
    BI笔记之SSAS库Process的几种方案
    PowerTip of the Day from powershell.com上周汇总(八)
    PowerTip of the Day2010071420100716 summary
    PowerTip of the Day from powershell.com上周汇总(十)
    PowerTip of the Day from powershell.com上周汇总(六)
    重新整理Cellset转Datatable
    自动加密web.config配置节批处理
    与DotNet数据对象结合的自定义数据对象设计 (二) 数据集合与DataTable
    在VS2003中以ClassLibrary工程的方式管理Web工程.
  • 原文地址:https://www.cnblogs.com/achenger/p/12797793.html
Copyright © 2011-2022 走看看