python 利用panda 实现列联表(交叉表)
作者:赏尔 发布时间:2022-02-21 02:24:32
交叉表(cross-tabulation,简称crosstab)是⼀种⽤于计算分组频率的特殊透视表。
语法详解:
pd.crosstab(index, # 分组依据
columns, # 列
values=None, # 聚合计算的值
rownames=None, # 列名称
colnames=None, # 行名称
aggfunc=None, # 聚合函数
margins=False, # 总计行/列
dropna=True, # 是否删除缺失值
normalize=False #
)
1 crosstab() 实例1
1.1 读取数据
import os
import numpy as np
import pandas as pd
file_name = os.path.join(path, 'Excel_test.xls')
df = pd.read_excel(io=file_name, # 工作簿路径
sheetname='透视表', # 工作表名称
skiprows=1, # 要忽略的行数
parse_cols='A:D' # 读入的列
)
df
1.2 pd.crosstab() 默认生成以行和列分类的频数表
pd.crosstab(df['客户名称'], df['产品类别'])
1.3 设置跟多参数实现分类汇总
pd.crosstab(index=df['客户名称'],
columns=df['产品类别'],
values=df['销量'],
aggfunc='sum',
margins=True
).round(0).fillna(0).astype('int')
注:因为交叉表示透视表的特例,所以交叉表可以用透视表的函数实现。又因为透视表可以用更 python 的方式 groupby-apply 实现,所以,交叉表完全可以用 groupby-apply 的方式实现。
2 用分类汇总的方法实现 交叉表
df.groupby(['客户名称', '产品类别']).apply(sum)
2.1 分类汇总、重新索引、设置数值格式综合应用
c_tbl = df.groupby(['客户名称', '产品类别']).apply(sum)['销量'].unstack()
c_tbl['总计'] = c_tbl.sum(axis=1) # 添加总计列
c_tbl.fillna(0).round(0).astype('int')
软件信息:
补充:使用python(pandas)将数据处理成交叉分组表
交叉分组表是汇总两种变量数据的方法, 在很多场景可以用到, 本文会介绍如何使用pandas将包含两个变量的数据集处理成交叉分组表.
环境
pandas
python 2.7
原理
用坐标轴来进行比喻, 其中一个变量作为x轴, 另一个作为y轴, 如果定位到数据则累加一, 将所有数据遍历一遍, 最后的坐标轴就是一张交叉分组表(使用坐标轴展示的数据一般是连续的, 交叉分组表的数据是离散的).
具体实现
示例数据:
quality price
0 bad 18
1 bad 17
2 great 52
3 good 28
4 excellent 88
5 great 63
6 bad 8
7 good 22
8 good 68
9 excellent 98
10 great 53
11 bad 13
12 great 62
13 good 48
14 excellent 78
15 great 63
16 good 37
17 great 69
18 good 28
19 excellent 81
20 great 43
21 good 32
22 great 62
23 good 28
24 excellent 82
25 great 53
代码:
import pandas as pd
from pandas import DataFrame, Series
#生成数据
df = DataFrame([['bad', 18], ['bad', 17], ['great', 52], ['good', 28], ['excellent', 88], ['great', 63]
, ['bad', 8], ['good', 22], ['good', 68], ['excellent', 98], ['great', 53]
, ['bad', 13], ['great', 62], ['good', 48], ['excellent', 78], ['great', 63]
, ['good', 37], ['great', 69], ['good', 28], ['excellent', 81], ['great', 43]
, ['good', 32], ['great', 62], ['good', 28], ['excellent', 82], ['great', 53]], columns = ['quality', 'price'])
#广播使用的函数
def quality_cut(data):
s = Series(pd.cut(data['price'], np.arange(0, 100, 10)))
return pd.groupby(s, s).count()
#进行分组处理
df.groupby(df['quality']).apply(quality_cut)
结果:
交叉分组
详细分析
从逻辑上来看, 为了达到对示例数据的交叉分组, 需要完成以下工作:
将数据以quality列进行分组.
将每个分组的数据分别进行cut, 以10为间隔.
将cut过的数据, 以cut的范围为列进行分组
将所有数据组合到一起, row为quality, columns为cut的范围
步骤1, pandasgroupby(...)接口, 会按照指定的列进行分组处理, 每一个分组, 存储相同类别的数据
<class 'pandas.core.frame.DataFrame'>
quality price
0 bad 18
1 bad 17
6 bad 8
11 bad 13
而我们需要的, 只是price这列的数据, 所以单独将这列拿出来, 进行cut, 最后得到我们要的series(步骤2, 步骤3)
price
(0, 10] 1
(10, 20] 3
(20, 30] 0
(30, 40] 0
(40, 50] 0
(50, 60] 0
(60, 70] 0
(70, 80] 0
(80, 90] 0
使用pandas
apply()的广播特性, 每一个分组的数据都会经过上述几个步骤的处理, 最后与第一次分组row进行组合.
后记
估计能力有限, 这个问题想了很长时间, 没想到pandas这么可以这么方便达成交叉分组的效果. 思考的时候主要是卡在数据组合上, 当数据量很大时通过多个步骤进行数据组合, 肯定是低效而且错误的. 最后仔细研究了groupby, dataframe, series, dataframeIndex等数据模型, 使用广播特性用几句代码就完成了. 证明了pandas的高性能, 也提醒自己遇见问题一定要耐心分析。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。如有错误或未考虑完全的地方,望不吝赐教。
来源:https://www.cnblogs.com/shanger/p/13246039.html
猜你喜欢
- 在网上查了部分资料但是发现粘上去的代码都存在问题,无奈只好自己修改了一下,代码如下: 如下代码能正常运行,都是网上查找资料最后拼凑总结出来的
- Python项目打包python本身是一种脚本语音,发布的话,直接发布源代码就可以了,但是,可能有些公司并不想发布源代码,那么,就涉及到打包
- 共享状态是比较容易理解和使用的,但是可能产生隐晦以至于很难追踪的 bugs。尤其是在我们的数据结构只有部分是通过引用传递的。切片就是这么一个
- 前言在目标检测中,数据集常常使用labelimg标注,会生成xml文件。本文旨在根据xml标注文件来裁剪目标,以达到去除背景信息的目的。xm
- 相信只要学习python的同学对于虚拟环境这个概念肯定不会太陌生,虚拟环境指的是一个个单独隔离的python开发环境。各个虚拟环境之间互不干
- 1:数据源Hollywood Movie Dataset: 好莱坞2006-2011数据集实验目的: 实现 统计2006-2011的数据综合
- 1. 背景:最近写了一篇CSDN博客需要上传gif图,发现大小超过了5M,无法上传。文件大小:本想自己找个免费的压缩工具,结果下载下来的工具
- 前言很多人都认为人脸识别是一项非常难以实现的工作,看到名字就害怕,然后心怀忐忑到网上一搜,看到网上N页的教程立马就放弃了。这些人里包括曾经的
- 如何一行行地读取文件?这样就可以做到一行行地读出了:dim input(30) ' 定义一个数组,大小
- 本次爬取网站为opgg,网址为:” http://www.op.gg/champion/statistics”由网站界面可以看出,右侧有英雄
- 看完本篇文章你可以:同步本地和服务器的全部或者部分文件本地debug,服务器跑实验在这之前你要确保服务器上已经创建好虚拟环境你本地已经安装好
- 本文介绍ThinkPHP的limit()方法的用法。limit方法可以用于对数据库操作的结果进行取指定范围的条数。即相当于是在mysql查询
- 算法思路Knuth-Morris-Pratt(KMP)算法是解决字符串匹配问题的经典算法,下面通过一个例子来演示一下:给定字符串"
- 在for循环中是否需要缓存length值,相信很多程序猿们都纠结过此问题,下面就这一问题的分析请看下文:在JS性能优化中,有一个常见的小优化
- 列表(list)和元组(tuple)的一些基础list和tuple都是一个可以放置任意数据类型的有序集合,都是既可以存放数字、字符串、对象等
- 本文实例讲述了Go语言转换所有字符串为大写或者小写的方法。分享给大家供大家参考。具体如下:Go语言的string模块包含了ToLower和T
- 下拉框包含option中的Value和用来显示的选项, 一般后台都是使用的Value值,而不是显示在前台的选项第一步: 编写下拉框需要的枚举
- 原因:使用git clone项目后,项目根路径是小写英文名称,比如cmdbapi,但是项目里面的import导入自己的相关包时,红色报错解决
- 1 获取jobs的当前任务状态server_1 = jenkins.Jenkins('http://%s:%s@192.168.37
- Sqlserver数据库分页查询一直是Sqlserver的短板,闲来无事,想出几种方法,假设有表ARTICLE,字段ID、YEAR...(其