Pandas_07透视表和交叉表

一、透视表

透视表(pivottable)是各种电子表格程序和其他数据分析软件中一种常见的数据汇总工具。它根据一个或多个键对数据进行聚合,并根据行和列上得分组建将数据分配到各个矩形区域中。在Python和pandas中,可以通过groupby功能以及(能够利用层次化索引的)重塑运算制作透视表。DataFrame有一个pivot_table方法,此外还有一个顶级的pandas.pivot_table函数。除了能为groupby提供便利之外,pivot_table还可以添加分项小计(也叫margins)。

1、透视表的优点:

  • 灵活性高,可以随意定制你的分析计算要求
  • 脉络清晰,易于理解数据
  • 操作性强,报表神器

2、透视表的使用:

使用index

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

常用参数说明:
    data: DataFrame
    values:待进行聚合运算的列名。默认聚合所有类型是数值的列。
    index:用于分组的列名或其他分组键(Grouper),出现在结果透视表的行(分组后作为行索引的列名)
    columns:用于分组的列名或其他分组键(Grouper),出现在结果透视表的列(分组后作为列索引的列名)
    aggfunc:指定对values参数所给的列做什么计算操作,默认为‘mean’。可以使任何对groupby有效的函数
    margins:是否进行行汇总和列汇总
    fill_value:对缺失值进行填充
    dropna:删除缺失值
'''

# 必须指定index分组键
pt = pd.pivot_table(book_data,index = 'original_publication_year')
pt.head()

index指定的分组列的数据出现在数据的每一行上,这些数据为行索引。此时为指定values,默认对所有数值型数据进行运算,默认运算为mean,计算均值

在这里插入图片描述
使用columns 和 values

columns :指定进行列分组的列
values:指定要被计算的列

pt = pd.pivot_table(book_data,values = ['ratings_count','average_rating'],index = ['original_publication_year','authors'],columns = 'language_code')
pt.tail()

columns指定的列数据出现在透视表的列上,为列索引

在这里插入图片描述

使用aggfunc和 margins

aggfunc:指定要进行的聚合运算
margins:是否进行行列汇总

pt = pd.pivot_table(book_data,values = 'books_count',index = ['original_publication_year','authors'],columns = 'language_code',aggfunc = np.sum,margins = True,margins_name = '总和',fill_value= 0)
pt.tail()

在这里插入图片描述

3、使用groupby功能以及重塑运算制作透视表(groupby与unstack)

unstack对应的是excel中的透视功能,stack正好相反是逆透视

u1 = book_data[['original_publication_year','authors','language_code','books_count']].groupby(['original_publication_year','authors','language_code']).sum()
u1.tail()

在这里插入图片描述 groupby数据没有交叉透视,需要借助unstack
另外相比于pivot_table,groupby没有汇总统计功能(即margins)

二、交叉表

交叉表是一种用于计算分组频率的特殊透视表。
(探索两个变量之间的关系)

读取数据:

hand_data = pd.read_excel('用手习惯调查.xlsx')
hand_data

在这里插入图片描述下面我们来探索一下性别和习惯之间的关系:

使用交叉表crosstab

pd.crosstab(hand_data['性别'],hand_data['惯用手'],margins= True)

在这里插入图片描述
使用透视表pivot_table

pd.pivot_table(hand_data,index = '性别',columns = '惯用手',aggfunc = len,margins= True )

在这里插入图片描述

总结

1、透视表pivot_table()是一种进行分组统计的函数,统计类型由参数aggfunc决定;
2、交叉表crosstab()是一种特殊的pivot_table(),专用于计算分组频率。

pandas 中的交叉表透视都是用于数据分析汇总的工具,但它们在处理数据时有所不同。 交叉表可以帮助我们快速计算两个或多个因素之间的频数,而透视则可以帮助我们将数据按照不同的维度进行分组并进行聚合计算。 下面我将分别介绍一下 pandas 中的交叉表透视。 ## 交叉表 pandas 中的 `crosstab()` 函数可以帮助我们创建交叉表。该函数的语法如下: ```python pandas.crosstab(index, columns, values=None, aggfunc=None, margins=False, margins_name='All', dropna=True, normalize=False) ``` 其中: - `index`:用于指定行索引的列或列名。 - `columns`:用于指定列索引的列或列名。 - `values`:用于指定填充交叉表的数据列或列名。如果不指定,则默认为计数。 - `aggfunc`:用于指定对数据进行聚合计算的函数。默认为计数。 - `margins`:用于指定是否在交叉表中添加行/列合计。默认为 False。 - `margins_name`:用于指定行/列合计的名称。默认为 "All"。 - `dropna`:用于指定是否删除包含缺失值的行/列。默认为 True。 - `normalize`:用于指定是否对交叉表进行标准化。 下面是一个示例: ```python import pandas as pd data = { "Gender": ["F", "M", "F", "M", "M", "M", "F", "F", "M", "F"], "Age": [30, 25, 35, 40, 30, 45, 35, 25, 30, 35], "City": ["Beijing", "Shanghai", "Guangzhou", "Shenzhen", "Shanghai", "Beijing", "Shenzhen", "Guangzhou", "Beijing", "Shenzhen"] } df = pd.DataFrame(data) print(df) # 创建交叉表 ct = pd.crosstab(df["Gender"], df["City"]) print(ct) ``` 输出结果为: ``` Gender Age City 0 F 30 Beijing 1 M 25 Shanghai 2 F 35 Guangzhou 3 M 40 Shenzhen 4 M 30 Shanghai 5 M 45 Beijing 6 F 35 Shenzhen 7 F 25 Guangzhou 8 M 30 Beijing 9 F 35 Shenzhen City Beijing Guangzhou Shanghai Shenzhen Gender F 1 1 0 2 M 2 0 2 1 ``` 上面的代码首先创建了一个包含 Gender、Age City 三列数据的 DataFrame。然后使用 `crosstab()` 函数创建了一个交叉表,用于统计不同性别城市的人数。 从输出结果可以看出,交叉表中的行列分别对应于原始数据中的 Gender City 列。交叉表中的值示对应行列的交叉处的人数。 ## 透视 pandas 中的 `pivot_table()` 函数可以帮助我们创建透视。该函数的语法如下: ```python pandas.pivot_table(data, values=None, index=None, columns=None, aggfunc='mean', fill_value=None, margins=False, margins_name='All', dropna=True) ``` 其中: - `data`:用于指定要使用的数据集。 - `values`:用于指定要进行聚合计算的数据列或列名。 - `index`:用于指定行索引的列或列名。 - `columns`:用于指定列索引的列或列名。 - `aggfunc`:用于指定对数据进行聚合计算的函数。默认为平均值。 - `fill_value`:用于指定要用于填充缺失值的值。 - `margins`:用于指定是否在透视中添加行/列合计。默认为 False。 - `margins_name`:用于指定行/列合计的名称。默认为 "All"。 - `dropna`:用于指定是否删除包含缺失值的行/列。默认为 True。 下面是一个示例: ```python import pandas as pd data = { "Gender": ["F", "M", "F", "M", "M", "M", "F", "F", "M", "F"], "Age": [30, 25, 35, 40, 30, 45, 35, 25, 30, 35], "City": ["Beijing", "Shanghai", "Guangzhou", "Shenzhen", "Shanghai", "Beijing", "Shenzhen", "Guangzhou", "Beijing", "Shenzhen"] } df = pd.DataFrame(data) print(df) # 创建透视 pt = pd.pivot_table(df, values="Age", index="City", columns="Gender", aggfunc="mean") print(pt) ``` 输出结果为: ``` Gender Age City 0 F 30 Beijing 1 M 25 Shanghai 2 F 35 Guangzhou 3 M 40 Shenzhen 4 M 30 Shanghai 5 M 45 Beijing 6 F 35 Shenzhen 7 F 25 Guangzhou 8 M 30 Beijing 9 F 35 Shenzhen Gender F M City Beijing 32.500000 37.500000 Guangzhou 30.000000 NaN Shanghai NaN 27.500000 Shenzhen 35.000000 40.000000 ``` 上面的代码首先创建了一个包含 Gender、Age City 三列数据的 DataFrame。然后使用 `pivot_table()` 函数创建了一个透视,用于统计不同城市性别的平均年龄。 从输出结果可以看出,透视中的行列分别对应于原始数据中的 City Gender 列。透视中的值示对应行列的交叉处的平均年龄。如果原始数据中没有某一行/列的数据,则透视中对应的单元格会显示为 NaN。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值