前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >数据透视之交叉表 crosstab()

数据透视之交叉表 crosstab()

作者头像
double
发布2019-05-28 18:51:57
2.5K0
发布2019-05-28 18:51:57
举报
文章被收录于专栏:算法channel算法channel

交叉表

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

看一个例子

代码语言:javascript
复制
import numpy as npimport pandas as pdfrom pandas import crosstab
a = 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])

结果为:

代码语言:javascript
复制
col_0   ameri   china   koreacol_1   good   good   betterrow_0       apple   0   2   0banana   1   0   0orange   1   0   1

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

代码语言:javascript
复制
for it in zip(a,b,c):    print(it)

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

代码语言:javascript
复制
('apple', 'china', 'good')('apple', 'china', 'good')('orange', 'ameri', 'good')('banana', 'ameri', 'good')('orange', 'korea', 'better')

同理,

代码语言:javascript
复制
pd.crosstab([a,b],[c])

结果为:

代码语言:javascript
复制
   col_0   better   goodrow_0   row_1     apple   china   0   2banana   ameri   0   1orange   ameri   0   1orange   korea   1   0

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

原型和参数

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

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

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

实际应用

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

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

代码语言:javascript
复制
pd.crosstab(df['类别'],df['产地'],margins=True)

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

代码语言:javascript
复制
产地   中国   新西兰   美国   All类别         水果   2   0   1   3肉类   0   1   1   2蔬菜   1   1   0   2All   3   2   2   7

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

代码语言:javascript
复制
pd.crosstab(df['类别'],df['产地'],values=df['价格'],aggfunc=np.max, margins=True)

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

代码语言:javascript
复制
总结

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

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

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2019-03-12,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 程序员郭震zhenguo 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档