解读pandas交叉表与透视表pd.crosstab()和pd.pivot_table()函数

 更新时间:2023年09月13日 09:25:13   作者:learning-striving  
这篇文章主要介绍了pandas交叉表与透视表pd.crosstab()和pd.pivot_table()函数的用法,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教

一、交叉表

交叉表:用于计算一列数据对于另外一列数据的分组个数(用于统计分组频率的特殊透视表),pd.crosstab(value1, value2)

pandas.crosstab(index, columns, values=None, rownames=None, colnames=None, aggfunc=None, margins=False, margins_name='All', dropna=True, normalize=False)

计算两个(或多个)因子的简单交叉制表。 默认情况下, 计算因子的频率表,除非传递值数组和聚合函数

  • index:类似数组、系列或数组/系列值的列表,行中分组依据的值
  • columns:类似数组、系列或数组/系列值的列表,列中要作为分组依据的值
  • values:类似数组,可选,要根据因素聚合的值数组,需要指定 aggfunc
  • rownames:序列,默认 None ,如果传递,必须匹配传递的行数组的数量
  • colnames:序列,默认 None ,如果传递,必须匹配传递的列数组的数量
  • aggfunc:function,可选,如果指定,则还需要指定值
  • margins:bool, 默认False 添加行/列边距(小计)
  • margins_name:str,默认为“All”,当边距为 True 时将包含总计的行/列的名称
  • dropna:bool, 默认为True,不包含条目均为 NaN 的列
  • normalize:bool, {‘all’, ‘index’, ‘columns’}, or {0,1}, 默认为False,通过将所有值除以值的总和来归一化

“all”或 True:将对所有值进行归一化

index:将对每一行进行归一化

columns:将对每一列进行归一化

若margins 为 True,也将标准化边距值

  • 返回:数据的 DataFrame 交叉表

传递的任何 Series 都将使用其名称属性,除非指定了交叉表的行或列名称。

传递的任何包含分类数据的输入都将在交叉表中包含其所有类别,即使实际数据不包含特定类别的任何实例也是如此。

如果没有重叠索引,将返回一个空的 DataFrame

a = np.array(["foo", "foo", "foo", "foo", "bar", "bar", "bar", "bar", "foo", "foo", "foo"], dtype=object)
b = np.array(["one", "one", "one", "two", "one", "one", "one", "two", "two", "two", "one"], dtype=object)
c = np.array(["dull", "dull", "shiny", "dull", "dull", "shiny", "shiny", "dull", "shiny", "shiny", "dull"], dtype=object)
pd.crosstab(a, [b, c], rownames=['a'], colnames=['b', 'c'])   
-----------------------------------------------------------------------------------------
# 算数运算,先求和
sum = count.sum(axis=1)
sum
-------------------------------------
# 进行相除操作,得出比例
pro = count.div(sum, axis=0)
pro
-------------------------------------
import matplotlib.pyplot as plt
pro.plot(kind='bar', stacked=True)
plt.show()

二、透视表

透视表:透视表是将原有的DataFrame的列分别作为行索引和列索引,然后对指定的列应用聚集函数,是一种可以对数据动态排布并且分类汇总的表格格式

DataFrame.pivot_table(values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, dropna=True, margins_name='All', observed=False, sort=True)

创建一个电子表格样式的数据透视表作为 DataFrame。数据透视表中的级别将存储在结果 DataFrame 的索引和列上的 MultiIndex 对象(分层索引)中

  • values:要聚合的列,可选,默认对所有列操作
  • index:column, Grouper, array, or list of the previous 如果传递数组,它必须与数据的长度相同。该列表可以包含任何其他类型(列表除外)。在数据透视表索引上分组的键。如果传递一个数组,它的使用方式与列值相同
  • column:column, Grouper, array, or list of the previous 如果传递一个数组,它必须和数据一样长。该列表可以包含任何其他类型(列表除外)。在数据透视表列上分组的键。如果传递一个数组,它的使用方式与列值相同
  • aggfunc:function, list of functions, dict, 默认为numpy.mean 如果传递函数列表,则生成的数据透视表将具有分层列,其顶层是函数名称(从函数对象本身推断)如果传递dict,则键是列聚合和值是函数或函数列表
  • fill_value:scalar,默认 None 用于替换缺失值的值(在聚合后的结果数据透视表中)
  • margins:bool, 默认False 添加所有行/列(例如小计/总计)
  • dropna:bool, 默认为True,不包含条目均为 NaN 的列。如果为 True,则在计算边距之前将忽略任何列中具有 NaN 值的行
  • margins_name:str,默认为“All” 当边距为 True 时将包含总计的行/列的名称
  • observed:bool,默认为 False 这仅适用于任何groupers 是分类的。若为True:仅显示分类groupers 的观察值。否则显示分类groupers 的所有值。​​​​​
  • sort:bool, default True 指定结果是否应该排序
  • 返回 DataFrame:Excel 样式的数据透视表

代码如下

df = pd.DataFrame({"A": ["aaa", "aaa", "aaa", "aaa", "aaa","aa", "aa", "aa"],
                   "B": ["bbb", "bbb", "bbb", "bb", "bb", "bbb", "bbb", "bb"],
                   "C": ["small", "large", "large", "small","small", "large", "small", "small"],
                   "D": [1, 2, 2, 3, 3, 4, 5, 6],
                   "E": [2, 4, 5, 5, 6, 6, 8, 9]})
df
---------------------------------------------------------------------------------------
pd.pivot_table(df, values='D', index=['A', 'B'], columns=['C'], aggfunc=np.sum)   # 通过求和来聚合值
pd.pivot_table(df, values='D', index=['A', 'B'], columns=['C'], aggfunc=np.sum, fill_value=0)   # 可以使用fill_value参数填充缺失的值
pd.pivot_table(df, values=['D', 'E'], index=['A', 'C'], aggfunc={'D': np.mean, 'E': np.mean})   # 通过对多个列取平均值进行聚合
pd.pivot_table(df, values=['D', 'E'], index=['A', 'C'], aggfunc={'D': np.mean, 'E': [min, max, np.mean]})   # 可以为任何给定值列计算多种类型的聚合

操作演示如下

总结

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • 一步步教你用Python实现2048小游戏

    一步步教你用Python实现2048小游戏

    相信2048这个游戏对大家来说一定不陌生,下面这篇文章就主要给大家介绍了怎么用Python实现2048小游戏,文中通过注释与示例代码介绍的很详细,相信对大家的理解和学习具有一定的参考借鉴价值,有需要的朋友们一起来看看吧。
    2017-01-01
  • python 写的一个爬虫程序源码

    python 写的一个爬虫程序源码

    这篇文章主要介绍了python 写的一个爬虫程序源码,需要的朋友可以参考下
    2016-02-02
  • python用folium绘制地图并设置弹窗效果

    python用folium绘制地图并设置弹窗效果

    这篇文章主要介绍了python用folium绘制地图并设置弹窗,本文通过实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • python实现经典排序算法的示例代码

    python实现经典排序算法的示例代码

    这篇文章主要介绍了python实现经典排序算法的示例代码,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-02-02
  • Python hashlib模块详情

    Python hashlib模块详情

    本文,我们来对Python 提供的安全哈希算法的通用接口-hashlib模块进行学习,文章内容具有一定的参考价值,需要的小伙伴可以参考一下
    2021-11-11
  • Python+matplotlib实现绘制等高线图示例详解

    Python+matplotlib实现绘制等高线图示例详解

    在matplotlib.pyplot中除了可以绘制常规图表如折线、柱状、散点等,还可以绘制常用在地理上的平面展示地型的等高线图,本文主要为大家介绍了如何利用matplotlib绘制等高线图,需要的可以参考一下
    2021-12-12
  • Python3.2中的字符串函数学习总结

    Python3.2中的字符串函数学习总结

    这篇文章主要介绍了Python3.2中的字符串函数学习总结,本文讲解了格式化类方法、查找 & 替换类方法、拆分 & 组合类方法等内容,需要的朋友可以参考下
    2015-04-04
  • 基于Python实现股票数据分析的可视化

    基于Python实现股票数据分析的可视化

    在购买股票的时候,可以使用历史数据来对当前的股票的走势进行预测,这就需要对股票的数据进行获取并且进行一定的分析。本文将介绍如何通过Python实现股票数据分析的可视化,需要的可以参考一下
    2021-12-12
  • 使用Python读取.nc文件的方法详解

    使用Python读取.nc文件的方法详解

    .nc文件,即NetCDF(Network Common Data Form)文件,是一种用于存储科学数据的文件格式,本文主要为大家介绍了两种常见的读取方法,希望对大家有所帮助
    2024-03-03
  • python3对拉勾数据进行可视化分析的方法详解

    python3对拉勾数据进行可视化分析的方法详解

    这篇文章主要给大家介绍了关于python3对拉勾数据进行可视化分析的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用Python3具有一定的参考学习价值,需要的朋友们下面来一起学习学习吧
    2019-04-04

最新评论