crosstab交叉表_数据透视之交叉表 crosstab()

共1866字,阅读时间4分钟  点击上方蓝色字体关注公众号

1 回顾

昨天总结了Python的69个内置函数,回看:

 Python 69个内置函数分类总结  这些内置函数无论何时,我们都可以任意调用,熟知它们是必要的。

在这之前介绍过Python数据透视功能的实现函数:pivot_table,它能实现数据分组聚合统计,这是pivot函数做不到的,它只能完成分组。今天,总结一个特殊的数据透视函数:crosstab,交叉表。

2 交叉表

不要被名字所迷惑,其实它也是二维的表结构,与pivot_table很相似,且是一个特殊的数据透视函数,它默认统计分组项的频次。

看一个例子

import numpy as npimport pandas as pdfrom pandas import crosstaba = np.array(['apple','apple', 'orange', 'banana', 'orange'],dtype=object)b = np.array(['china','china', 'ameri', 'ameri', 'korea'],dtype=object)c = np.array([ 'good','good','good','good','better'],dtype=object)pd.crosstab(a,[b,c])

结果为:

col_0 ameri china koreacol_1 good good betterrow_0apple 0 2 0banana 1 0 0orange 1 0 1

这个怎么理解? 其实就是轴0和轴1的组合后,每项出现的频次。实质等价于:

for it in zip(a,b,c):print(it)

结果,大家可以看到apple,china,good这项出现的频次为2,其他频次都是1.

('apple', 'china', 'good')('apple', 'china', 'good')('orange', 'ameri', 'good')('banana', 'ameri', 'good')('orange', 'korea', 'better')

同理,

pd.crosstab([a,b],[c])

结果为:

col_0 better goodrow_0 row_1apple china 0 2banana ameri 0 1orange ameri 0 1orange korea 1 0

还是只有一项(apple, china, good)频次为2,和上面的原理一样。

3 原型和参数

crosstab函数也是Pandas中的顶层函数,函数参数包括:

其中 index, columns是必选参数,分别是行索引、列索引。

其他参数可以理解为与pivot_table一致,所以说它是一种特殊的透视表。

4 实际应用

df = DataFrame({'类别':['水果','水果','水果','蔬菜','蔬菜','肉类','肉类'],'产地':['美国','中国','中国','中国','新西兰','新西兰','美国'],'水果':['苹果','梨','草莓','番茄','黄瓜','羊肉','牛肉'],'数量':[5,5,9,3,2,10,8],'价格':[5,5,10,3,3,13,20]})df #显示df

产地 价格 数量 水果 类别0 美国 5 5 苹果 水果1 中国 5 5 梨 水果2 中国 10 9 草莓 水果3 中国 3 3 番茄 蔬菜4 新西兰 3 2 黄瓜 蔬菜5 新西兰 13 10 羊肉 肉类6 美国 20 8 牛肉 肉类

按照类别为index, 产地为columns,统计词条出现频次:

pd.crosstab(df['类别'],df['产地'],margins=True)

比如类别为水果,产地在中国的出现频次为2,结果如下:

产地 中国 新西兰 美国 All类别水果 2 0 1 3肉类 0 1 1 2蔬菜 1 1 0 2All 3 2 2 7

如果想使用聚合函数,即aggfun参数,同时必须指明values列,如下:

pd.crosstab(df['类别'],df['产地'],values=df['价格'],aggfunc=np.max, margins=True)

结果如下,看到实现效果与pivot_table是相似的。

产地 中国 新西兰 美国 All类别水果 10.0 NaN 5.0 10.0肉类 NaN 13.0 20.0 20.0蔬菜 3.0 3.0 NaN 3.0All 10.0 13.0 20.0 20.0

5 总结

crosstab本质:按照指定的index和columns统计数据帧中出现(index, columns)的频次。也可以理解为分组。

pivot_table, crosstab,聚合功能前面提到过是建立在groupby基础上的,所以最本质的还是一个分组统计功能。

总第251篇原创,数据分析系列第5篇原创。如果觉得有帮助,再点好看。

原创,坚持

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
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、付费专栏及课程。

余额充值