分享python数据统计的一些小技巧


Posted in Python onJuly 21, 2016

最近在用python做数据统计,这里总结了一些最近使用时查找和总结的一些小技巧,希望能帮助在做这方面时的一些童鞋。有些技巧是很平常的用法,平时我们没有注意,但是在特定场景,这些小方法还是能带来很大的帮助。

1.在字典中将键映射到多个值上面

{'b': [4, 5, 6], 
'a': [1, 2, 3]}

有时候我们在统计相同key值的时候,希望把所有相同key的条目添加到以key为键的一个字典中,然后再进行各种操作,这时候我们就可以使用下面的代码进行操作:

from collections import defaultdict
d = defaultdict(list)
print(d)
d['a'].append(1)
d['a'].append(2)
d['a'].append(3)
d['b'].append(4)
d['b'].append(5)
d['b'].append(6)
print(d)
print(d.get("a"))
print(d.keys())
print([d.get(i) for i in d])

这里是使用了collections中的方法,这里面还拥有很多有用的方法,我们有时间在继续进行深入了解。

上面代码运行结果:

defaultdict(, {})
defaultdict(, {'b': [4, 5, 6], 'a': [1, 2, 3]})
[1, 2, 3]
dict_keys(['b', 'a'])
[[4, 5, 6], [1, 2, 3]]

我们将数据填入之后,相当于进行快速分组,然后遍历每个组就可以统计一些我们需要的数据。

2.迅速转换字典键值对

data = {...}
zip(data.values(), data.keys())

data是我们的格式数据,使用zip后进行快速键值转换,然后可以使用max,min之类函数进行数据操作。

3.通过公共键对字典进行排序

from operator import itemgetter
data = [
  {'name': "bran", "uid": 101},
  {'name': "xisi", "uid": 102},
  {'name': "land", "uid": 103}
]
print(sorted(data, key=itemgetter("name")))
print(sorted(data, key=itemgetter("uid")))

数据格式就是data,我们想要对name或者uid进行排序我们就是用代码中的方法。
运行结果:

[{'name': 'bran', 'uid': 101}, {'name': 'land', 'uid': 103}, {'name': 'xisi', 'uid': 102}]
[{'name': 'bran', 'uid': 101}, {'name': 'xisi', 'uid': 102}, {'name': 'land', 'uid': 103}]

正如我们期望中的一样

4.对列表中的多个字典根据某一字段进行分组

注意注意,在进行分组前要首先对数据进行排序处理,排序字段根据实际要求来选择

即将处理的数据:

rows = [
  {'name': "bran", "uid": 101, "class": 13},
  {'name': "xisi", "uid": 101, "class": 11},
  {'name': "land", "uid": 103, "class": 10}
]

期望处理结果:

{
101: [{'name': 'xisi', 'class': 11, 'uid': 101},{'name': 'bran', 'class': 13, 'uid': 101}],
103: [{'name': 'land', 'class': 10, 'uid': 103}]
}

我们按照uid进行分组,这里只是演示,uid一般也不会重复。

这个比较复杂一点,我们一部一步来分解

some = [('a', [1, 2, 3]), ('b', [4, 5, 6])]
print(dict(some))

结果:

{'b': [4, 5, 6], 'a': [1, 2, 3]}

这里我们的目的是将元组转换成字典,这个很简单,应该都能看懂。接着我们来下一步对待处理数据进行排序:

data_one = sorted(rows, key=itemgetter("class"))
print(data_one)
data_two = sorted(rows, key=lambda x: (x["uid"], x["class"]))
print(data_two)

这里我们提供两种排序方式原理相同,只是样式稍有区别,第一种data_one是直接使用itemgetter,按照我们前面使用过得,直接按照某一字段进行排序,可是有时候我们会有另一种要求:

先按照某一字段排序,当第一字段重复时,再按照另一字段排序。

这时我们就用第二种方法,进行多字段值排序。
排序结果如下:

[{'name': 'land', 'class': 10, 'uid': 103}, {'name': 'xisi', 'class': 11, 'uid': 101}, {'name': 'bran', 'class': 13, 'uid': 101}]
[{'name': 'xisi', 'class': 11, 'uid': 101}, {'name': 'bran', 'class': 13, 'uid': 101}, {'name': 'land', 'class': 10, 'uid': 103}]

结果大家慢慢看一下,还是略有差别。

接下来就进行最后一步了,将我们刚才讲的两种方式结合起来使用:

data = dict([(g, list(k)) for g, k in groupby(data_two, key=lambda x: x["uid"])])
print(data)

我们对排序好的数据进行分组,然后生成元组列表,最后将其转换成字典,这里大功告成,我们成功将数据进行分组。

python数据统计的一些小技巧就分享到这,有需要的可以参考学习。

Python 相关文章推荐
Python中的特殊语法:filter、map、reduce、lambda介绍
Apr 14 Python
Numpy数组转置的两种实现方法
Apr 17 Python
python批量下载网站马拉松照片的完整步骤
Dec 05 Python
python print输出延时,让其立刻输出的方法
Jan 07 Python
在pycharm下设置自己的个性模版方法
Jul 15 Python
Python识别快递条形码及Tesseract-OCR使用详解
Jul 15 Python
Anaconda 查看、创建、管理和使用python环境的方法
Dec 03 Python
Python基于模块Paramiko实现SSHv2协议
Apr 28 Python
解决Keras中循环使用K.ctc_decode内存不释放的问题
Jun 29 Python
使用keras时input_shape的维度表示问题说明
Jun 29 Python
用Python可视化新冠疫情数据
Jan 18 Python
python中字符串String及其常见操作指南(方法、函数)
Apr 06 Python
python中print的不换行即时输出的快速解决方法
Jul 20 #Python
Python全局变量用法实例分析
Jul 19 #Python
python对象及面向对象技术详解
Jul 19 #Python
python异常和文件处理机制详解
Jul 19 #Python
python线程、进程和协程详解
Jul 19 #Python
浅谈python字符串方法的简单使用
Jul 18 #Python
python读取oracle函数返回值
Jul 18 #Python
You might like
PHP的FTP学习(二)
2006/10/09 PHP
Laravel学习教程之IOC容器的介绍与用例
2017/08/15 PHP
laravel开发环境homestead搭建过程详解
2020/07/03 PHP
jquery实现在页面加载完毕后获取图片高度或宽度
2014/06/16 Javascript
jQuery UI库中dialog对话框功能使用全解析
2016/04/23 Javascript
自己动手制作基于jQuery的Web页面加载进度条插件
2016/06/03 Javascript
总结在前端排序中遇到的问题
2016/07/19 Javascript
Bootstrap表单制作代码
2017/03/17 Javascript
基于ExtJs在页面上window再调用Window的事件处理方法
2017/07/26 Javascript
vue 实现类似淘宝星级评分的示例
2018/03/01 Javascript
简单学习5种处理Vue.js异常的方法
2019/06/17 Javascript
微信小程序 自定义复选框实现代码实例
2019/09/04 Javascript
Vuex modules模式下mapState/mapMutations的操作实例
2019/10/17 Javascript
JavaScript事件冒泡机制原理实例解析
2020/01/14 Javascript
[01:14]2019完美世界城市挑战赛(秋季赛)全国总决赛精彩花絮
2020/01/08 DOTA
Android模拟器无法启动,报错:Cannot set up guest memory ‘android_arm’ Invalid argument的解决方法
2016/07/01 Python
Python实现Dijkstra算法
2018/10/17 Python
Pandas中resample方法详解
2019/07/02 Python
Python实用库 PrettyTable 学习笔记
2019/08/06 Python
详解python中docx库的安装过程
2019/11/08 Python
html5 datalist 选中option选项后的触发事件
2020/03/05 HTML / CSS
世界上最大的高分辨率在线图片库:Alamy
2018/07/07 全球购物
Pedro官网:新加坡时尚品牌
2019/08/27 全球购物
Tommy Hilfiger澳洲官网:美国高端休闲领导品牌
2020/12/16 全球购物
介绍一下SOA和SOA的基本特征
2016/02/24 面试题
大学生求职自我评价
2014/01/16 职场文书
幼儿园美术教学反思
2014/01/31 职场文书
节电标语大全
2014/06/23 职场文书
校园环保广播稿(3篇)
2014/09/15 职场文书
学校开学标语
2014/10/06 职场文书
小学四年级学生评语
2014/12/26 职场文书
护士工作心得体会
2016/01/25 职场文书
推荐六本经典文学奖书籍:此生必读
2019/08/22 职场文书
go语言中http超时引发的事故解决
2021/06/02 Golang
如何使用Tkinter进行窗口的管理与设置
2021/06/30 Python
Golang Elasticsearches 批量修改查询及发送MQ
2022/04/19 Golang