什么时候在Python Pandas中使用crosstab和pivot_table?
在本文中,我们将向您展示在Python Pandas中何时使用crosstab()和pivot_table()函数。
何时使用crosstab或pivot_table
数据透视表期望您的输入数据已经是数据帧;您将数据帧传递给数据透视表,并通过传递列名称作为字符串来指定索引/列/值。而在交叉表中,您不需要传递数据帧,因为您只需要将类似数组的对象传递给索引/列/值。
通常,如果您已经有一个数据帧,使用数据透视表可以避免您需要重复创建数据帧两次的问题。如果您从类似数组的对象开始并且仅对透视数据感兴趣,请使用交叉表。在大多数情况下,我认为使用哪个函数并没有多大区别。
pandas.crosstab()函数
使用crosstab()方法可以计算两个或多个因素的简单交叉制表。除非传递了值数组和聚合函数,否则默认情况下,会计算因素的频率表。
这个函数允许我们以许多不同的方式自定义数据。乍一看,它似乎与Pandas数据透视表函数非常相似。
语法
pandas.crosstab(index, columns, values=None, rownames=None, colnames=None,
aggfunc=None, margins=False, margins_name=’All’, dropna=True, normalize=False)
参数
参数 | 说明 | 默认值 |
---|---|---|
index | 行中要分组的数组,系列或值 | |
columns | 要在列中分组的数组,系列或值 | |
values | 要聚合的一组值 | |
rownames | 行的名称(列表) | |
colnames | 列的名称(列表) | |
aggfunc(可选) | 指定如何聚合数据,如果给定,则需要指定“值”。 | 计数 |
margins | 添加行/列总计 | False |
margins_name | 行/列总和的名称 | “All” |
dropna | 删除所有条目均为NaN的列 | True |
normalize | 通过将所有值除以所有值的总和而进行归一化 | False |
与数据透视表函数相比,交叉表函数具有几个优点,包括:
- 摘要可以规范化以将数据显示为行或列总数的百分比。
-
在分析之前不需要将数据结构化为数据帧。
Pandas Crosstab vs. Pivot Table
您可以使用Pandas Crosstab完成的很多操作,也可以使用Pandas PivotTable完成,主要区别如下:
该函数不需要数据帧作为输入。对于它的行和列,它还可以接受类似数组的对象。
该函数可以归一化输出数据帧,这意味着显示的数字可以表示为行或列总数的百分比。
默认函数是len(count),而数据透视表函数是NumPy的平均值。
在Pandas中创建交叉表
算法(步骤)
以下是执行所需任务的算法/步骤:
- 使用import关键字导入pandas、numpy模块。
-
使用numpy模块的array()函数(返回一个ndarray,即一个满足给定要求的数组对象)创建numpy数组。
-
使用cross_tab()函数创建给定NumPy数组的交叉表并打印出来。
示例
以下程序使用crosstab()函数返回给定NumPy数组的交叉表 −
# 导入pandas和numpy模块
import pandas
import numpy
# 创建numpy数组
array_1 = numpy.array(["cat", "cat", "cat", "cat", "rat", "rat", "rat", "rat", "cat", "cat", "cat"], dtype=object)
array_2 = numpy.array(["pin", "pin", "pin", "bat", "pin", "pin", "pin", "bat", "bat", "bat", "pin"], dtype=object)
array_3 = numpy.array(["book", "book", "car", "book", "book", "car", "car", "book", "car", "car", "car"], dtype=object)
# 创建十字表,行名是数组1的名称,列名是数组2和数组3的名称
print(pandas.crosstab(array_1, [array_2, array_3], rownames=['array_1'],
colnames=['array_2', 'array_3']))
输出
执行以上程序将生成以下输出−
array_2 bat pin
array_3 book car book car
array_1
cat 1 2 2 2
rat 1 0 1 2
pandas.pivot_table()函数
pivot_table() 函数作为一个 DataFrame,创建一个类似于电子表格的透视表。
透视表中的级别将被保存为 MultiIndex 对象(分层索引)在结果 DataFrame 的索引和列上。
语法
pandas.pivot_table(data, values=None, index=None, columns=None, aggfunc=’mean’, fill_value=None, margins=False, dropna=True, margins_name=’All’)
使用pandas创建一个简单的dataframe
算法(步骤)
执行以下算法/步骤以执行所需任务:
- 使用 import 关键字,导入别名为 pandas、numpy 的模块。
-
使用 pandas 模块的 DataFrame() 函数创建数据框。
-
打印输入的数据框。
例子
以下程序使用 DataFrame() 函数返回一个数据框——
# 导入 pandas 和 numpy 模块并指定别名
import pandas as pd
import numpy as np
# 创建数据框
inputDataframe = pd.DataFrame({'Name': ['Virat', 'Rohit', 'Meera', 'Nick', 'Sana'], 'Jobrole': ['Developer', 'Analyst', 'Help Desk', 'Database Developer', 'Finance accountant'], 'Age': [25, 30, 28, 25, 40]})
# 显示数据框
print(inputDataframe)
输出
执行以上程序将生成以下输出——
Name Jobrole Age
0 Virat Developer 25
1 Rohit Analyst 30
2 Meera Help Desk 28
3 Nick Database Developer 25
4 Sana Finance accountant 40
对上面的数据框创建一个透视表
例子
以下程序创建一个简单的透视表,该透视表具有数据框和一个索引/索引列表。
# 导入 pandas 和 numpy 模块并指定别名
import pandas as pd
import numpy as np
# 创建数据框
inputDataframe = pd.DataFrame({'Name': ['Virat', 'Rohit', 'Meera', 'Nick','Sana'], 'Jobrole': ['Developer', 'Analyst', 'Help Desk', 'Database Developer', 'Finance accountant'],'Age': [25, 30, 28, 35, 40]})
# 创建一个简单的透视表,该透视表具有数据框和一个索引/索引列表。
# 创建透视表
result_pivottable = pd.pivot_table(inputDataframe, index =['Name', 'Jobrole',])
# 显示透视表
print(result_pivottable)
输出
执行以上程序将生成以下输出——
Name Jobrole Age
Meera Help Desk 28
Nick Database Developer 35
Rohit Analyst 30
Sana Finance accountant 40
Virat Developer 25
结论
通过使用一些例子,我们学会了在何时使用crosstab()函数和何时使用数据透视表函数。