共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篇原创。如果觉得有帮助,再点好看。
原创,坚持