分享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不规范的日期字符串处理类
Jun 10 Python
将Python代码嵌入C++程序进行编写的实例
Jul 31 Python
python+mongodb数据抓取详细介绍
Oct 25 Python
Django中的Model操作表的实现
Jul 24 Python
Django中如何使用sass的方法步骤
Jul 09 Python
基于python进行抽样分布描述及实践详解
Sep 02 Python
python实现连连看游戏
Feb 14 Python
python梯度下降算法的实现
Feb 24 Python
Python greenlet和gevent使用代码示例解析
Apr 01 Python
了解一下python内建模块collections
Sep 07 Python
python中实现栈的三种方法
Dec 19 Python
python中numpy.empty()函数实例讲解
Feb 05 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
德生BCL3000的电路分析和打磨
2021/03/02 无线电
PHP排序之二维数组的按照字母排序实现代码
2011/08/13 PHP
PHP中实现获取IP和地理位置类分享
2015/02/10 PHP
Zend Framework动作助手(Zend_Controller_Action_Helper)用法详解
2016/03/05 PHP
PHP结合Ueditor并修改图片上传路径
2016/10/16 PHP
微信公众号模板消息群发php代码示例
2016/12/29 PHP
php-msf源码详解
2017/12/25 PHP
12个非常有创意的JavaScript小游戏
2010/03/18 Javascript
JavaScript中的几个关键概念的理解-原型链的构建
2011/05/12 Javascript
JavaScript高级程序设计 阅读笔记(十三) js定义类或对象
2012/08/14 Javascript
jQuery实现div浮动层跟随页面滚动效果
2014/02/11 Javascript
Jquery方式获取iframe页面中的 Dom元素
2014/05/07 Javascript
node.js中的fs.write方法使用说明
2014/12/15 Javascript
自己动手手写jQuery插件总结
2015/01/20 Javascript
Jquery 实现图片轮换
2015/01/28 Javascript
javascript实现全角半角检测的方法
2015/07/23 Javascript
jQuery图片切换动画特效
2016/11/02 Javascript
JS实现页面进入和返回定位到具体位置
2016/12/08 Javascript
判断横屏竖屏(三种)
2017/02/13 Javascript
动手写一个angular版本的Message组件的方法
2017/12/16 Javascript
小程序实现页面顶部选项卡效果
2018/11/06 Javascript
nuxt踩坑之Vuex状态树的模块方式使用详解
2019/09/06 Javascript
[05:01]3.19DOTA2发布会 我们都是刀塔人
2014/03/25 DOTA
基于Django用户认证系统详解
2018/02/21 Python
python 用正则表达式筛选文本信息的实例
2018/06/05 Python
python网络编程:socketserver的基本使用方法实例分析
2020/04/09 Python
安装并免费使用Pycharm专业版(学生/教师)
2020/09/24 Python
html5实现滑块功能之type="range"属性
2020/02/18 HTML / CSS
爱淘宝:淘宝网购物分享平台
2017/04/28 全球购物
英国现代家具和装饰网站:PN Home
2018/08/16 全球购物
高中同学聚会邀请函
2014/01/11 职场文书
企业领导班子四风对照检查材料
2014/09/27 职场文书
2015年员工试用期工作总结
2014/12/12 职场文书
焦裕禄纪念馆观后感
2015/06/09 职场文书
2016年大学生暑假爱心支教活动策划书
2015/11/26 职场文书
幼儿园教师辞职信
2019/06/21 职场文书