专栏首页数据STUDIOPandas进阶|数据透视表与逆透视

Pandas进阶|数据透视表与逆透视

数据透视表将每一列数据作为输入,输出将数据不断细分成多个维度累计信息的二维数据表。在实际数据处理过程中,数据透视表使用频率相对较高,今天云朵君就和大家一起学习pandas数据透视表与逆透视的使用方法。

本次使用的数据来源于Kaggle,车辆被警察拦下并进行搜查记录数据集,简称车辆数据。文末有下载方式,大家按需获取。

数据基本情况

groupby数据透视表

使用 pandas.DataFrame.groupby 函数,其原理如下图所示。

使用车辆数据集统计不同性别司机的平均年龄,聚合后用二维切片可以输出DataFrame数据框。

data.groupby('driver_gender'
            )[['driver_age']].mean()

在聚合后一维切片会得到 pandas.Series.

data.groupby('driver_gender'
            )['driver_age'].mean()
driver_gender
F    32.607399
M    34.537886
Name: driver_age, dtype: float64

可能还想进一步探索,同时观察不同司机性别与司机种族的平均年龄。根据 GroupBy 的操作流程,我们也许能够实现想要的结果:将司机种族('driver_race')与司机性别('driver_gender')分组,然后选择司机年龄('driver_age')列,应用均值('mean')累计函数,再将各组结果组合,最后通过行索引转列索引操作将最里层的行索引转换成列索引,形成二维数组。

data.groupby(['driver_gender',
              'driver_race']
              )[['driver_age']].aggregate('mean')

通过unstack重排数据表

如果原表只有一级索引,unstack就将每一个列都分出来,然后全部纵向叠加在一起,每一个列名作为新的一级索引,原本的索引作为二级索引。如果原表有二级索引,那么unstack就会将二级索引作为新的列名,一级索引作为新的索引。

data.groupby(['driver_gender', 
              'driver_race']
            )[['driver_age']].aggregate('mean').unstack()

pivot_table

虽然这样就可以更清晰地观察出不同司机性别与司机种族的平均年龄,但代码有点复杂。要理解这个长长的语句可不是那么容易的事。

由于二维的 GroupBy 应用场景非常普遍,因此 Pandas 提供了一个快捷方式 pivot_table 来快速解决多维的累计分析任务。

pivot_table()的参数 values 待聚合的列的名称。默认聚合所有数值列 index 用于分组的列名或其他分组键,出现在结果透视表的行 columns 用于分组的列名或其他分组键,出现在结果透视表的列 aggfunc 聚合函数或函数列表,默认为'mean'。可以使任何对groupby有效的函数 fill_value 用于替换结果表中的缺失值 dropna 默认为True margins_name 默认为'ALL',当参数margins为True时,ALL行和列的名字

同样是上面的需求,同时观察不同司机性别与司机种族的平均年龄 ,用pivot_table实现透视表。

data.pivot_table(values='driver_age', 
                 index='driver_gender', 
                 columns='driver_race')

多级数据透视表

与 GroupBy 类似,数据透视表中的分组也可以通过各种参数指定多个等级。

行索引和列索引都可以再设置为多层,不过行索引和列索引在本质上是一样的,大家需要根据实际情况合理布局。

data.pivot_table(values='driver_age', 
                 index=['driver_gender',
                        'stop_duration'], 
                 columns='driver_race')

自定义聚合函数

aggfunc 参数用于设置累计函数类型,默认值是均值(mean)。累计函数可以用一些常见的字符串 ('sum'、'mean'、'count'、'min'、'max' 等)表示,也可以用标准的累计函数(np.sum()、min()、sum() 等)。

还可以通过字典为不同的列指定不同的累计函数。

  • 如果传入参数为list,则每个聚合函数对每个列都进行一次聚合。
  • 如果传入参数为dict,则每个列仅对其指定的函数进行聚合, 此时values参数可以不传。
data.pivot_table(index='driver_gender', 
                 columns='driver_race',
                 aggfunc={'driver_age':'mean', 
                          'violation':'count'})

这里没有使用参数 values。其实在我们通过字典为 aggfunc 指定映射关系的时候,待透视的数值就已经确定了。

margin 的标签可以通过 margins_name 参数进行自定义, 默认值是 "All"。

下面按行、按列进行汇总,指定汇总列名为“Total”

data.pivot_table(index="driver_gender", 
                 columns="driver_race",
                 values="violation", 
                 aggfunc= "count",
                 margins=True, 
                 margins_name="Total")

pandas.crosstab

crosstab 是交叉表,是一种特殊的数据透视表默认是计算分组频率的特殊透视表(默认的聚合函数是统计行列组合出现的次数)。如果指定了聚合函数则按聚合函数来统计,但是要指定values的值,指明需要聚合的数据。

pandas.crosstab 参数 index:指定了要分组的列,最终作为行。 columns:指定了要分组的列,最终作为列。 values:指定了要聚合的值(由行列共同影响),需要指定aggfunc参数。 rownames:指定了行名称。 colnames:指定了列名称。 aggfunc:指定聚合函数。必须指定values的值。 margins:布尔值,是否分类统计。默认False。 margins_name:分类统计的名称,默认是"All"。 dropna:是否包含全部是NaN的列。默认是True。

pd.crosstab(index=data.driver_gender, 
            columns=data.driver_race, 
            margins=True)

逆透视

如果说 df.pivot()将长数据集转换成宽数据集,df.melt() 则是将宽数据集变成长数据集 melt() 既是顶级类函数也是实例对象函数,作为类函数出现时,需要指明 DataFrame 的名称

pd.melt 参数 frame 被 melt 的数据集名称在 pd.melt() 中使用 id_vars 不需要被转换的列名,在转换后作为标识符列(不是索引列) value_vars 需要被转换的现有列,如果未指明,除 id_vars 之外的其他列都被转换 var_name 自定义列名名称,设置由 'value_vars' 组成的新的 column name value_name 自定义列名名称,设置由 'value_vars' 的数据组成的新的 column name col_level 如果列是MultiIndex,则使用此级别

df = data.loc[:,['driver_gender', 
                 'driver_race', 
                 'violation']]
df
df_pivot = data.pivot_table(index="driver_gender", 
                      columns="driver_race",
                      values="violation", 
                      aggfunc= "count")
df_pivot

为方便下面转换的理解,经过去除columns的name后得到:

下面开始进行转换。保留"driver_gender",对剩下列全部转换,并给设置对列定义列名。

df_wide.melt(id_vars='driver_gender',
             var_name = 'driver_race',
             value_name='violation_count')

上述同样的结果用groupby也可以做到,如下所示。

df.groupby(['driver_gender',
            'driver_race']
          )[['violation']].agg('count').reset_index()

这里补充说明下去除columns的name及index的name的方法。

如下图所示"driver_race" 和 "driver_gender" 分别是columns的name,index的name。

下面演示一个平时较为头疼的事情。即将两个name删掉。下面介绍一个常见的方法。

使用pandas.DataFrame.rename_axis去除columns列的名称

# 第一步,重置索引
df_wide = df_pivot.reset_index()
# 重置name,设置为None即可
df_wide.rename_axis([None], axis=1)    
# columns有N个,就用N个None

另外一种情况如下图所示,在column上还有一个"driver_age",此时需要在第一步使用pandas.DataFrame.droplevel把"driver_age"删除:df.columns = df.columns.droplevel(0)

然后在执行上面两步。

本文分享自微信公众号 - 数据STUDIO(jim_learning),作者:云朵君

原文出处及转载信息见文内详细说明,如有侵权,请联系 yunjia_community@tencent.com 删除。

原始发表时间:2021-06-24

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • 在pandas中使用数据透视表

    经常做报表的小伙伴对数据透视表应该不陌生,在excel中利用透视表可以快速地进行分类汇总,自由组合字段聚合计算,而这些只需要拖拉拽就能实现。

    bugsuse
  • PQ-数据转换10:一维表和二维表,透视及逆透视

    小勤:前面你的很多个关于PowerQuery的内容里都涉及到逆透视,这到底是什么意思呢?这个概念一直觉得似懂非懂的,有没有简单点的语句总结一下?

    大海Power
  • 对比Excel,学习pandas数据透视表

    用户1564362
  • 对比Excel,学习pandas数据透视表

    朱小五
  • 对比excel,学习pandas数据透视表

    数据分析与统计学之美
  • 数据分析处理库Pandas——数据透视表

    py3study
  • VBA数据透视表

    林万程
  • SQL、Pandas和Spark:如何实现数据透视表?

    数据透视表是一个很重要的数据统计操作,最有代表性的当属在Excel中实现(甚至说提及Excel,个人认为其最有用的当属三类:好用的数学函数、便捷的图表制作以及强...

    luanhz
  • 数据透视表入门

    今天跟大家分享有关数据透视表入门的技巧! 数据透视表是excel附带功能中为数不多的学习成本低、投资回报率高、门槛低上手快的良心技能! 对于日程的排序、汇总、...

    数据小磨坊
  • 【数据分析可视化】透视表

    瑞新
  • Python数据分析pandas之分组统计透视表

    Python数据分析pandas之分组统计透视表 ...

    Java架构师必看
  • 数据透视表多表合并

    今天跟大家分享有关数据透视表多表合并的技巧! 利用数据透视表进行多表合并大体上分为两种情况: 跨表合并(多个表在同一工作薄内) 跨工作薄合并(多个表分别在不同...

    数据小磨坊
  • 一道基础题,多种解题思路,引出Pandas多个知识点

    这道题最简单的解法,相信大部分用过pandas的朋友都会,林胖也马上发出了自己的答案:

    朱小五
  • 用Python进行数据分析之数据透视表

    在节前的一次推送中,我写了如何使用FME来进行进行数据透视的相关分析。今天来填之前挖的坑,使用Python来完成同样的数据分析。只不过,Py实现起来,更简洁! ...

    数据处理与分析
  • 用FME进行数据分析之数据透视表

    数据透视表是计算、汇总和分析数据的强大工具,可助你了解数据中的对比情况、模式和趋势。

    数据处理与分析
  • [Excel技巧]只用一个公式可以实现对数据透视表进行再透视

    日常Excel业务报表中,我们有时需要对透视过的数据进行各种运算,运算完成后再次进行透视,本文提供一种简便方案,可以进行透视表再透视,数据源更新不影响刷新使用。...

    wujunmin
  • Pandas 数据分析小技巧系列 第五集

    固定列zip_code,组合factory,warehouse,retail 三个列名为一个维度,按照这种方法凑齐两个维度后,数据一定变长。

    double
  • 左手pandas右手Python,带你学习数据透视表

    数据透视表是数据分析工作中经常会用到的一种工具。Excel本身具有强大的透视表功能,Python中pandas也有透视表的实现。本文使用两个工具对同一数据源进行...

    Datawhale
  • (数据科学学习手札06)Python在数据框操作上的总结(初级篇)

    数据框(Dataframe)作为一种十分标准的数据结构,是数据分析中最常用的数据结构,在Python和R中各有对数据框的不同定义和操作。 Python 本文涉及...

    Feffery

扫码关注云+社区

领取腾讯云代金券