11个Python Pandas小技巧让你的工作更高效(附代码实例)


Posted in Python onApril 30, 2019

本文为你介绍Pandas隐藏的炫酷小技巧,我相信这些会对你有所帮助。

或许本文中的某些命令你早已知晓,只是没意识到它还有这种打开方式。

Pandas是一个在Python中广泛应用的数据分析包。市面上有很多关于Pandas的经典教程,但本文介绍几个隐藏的炫酷小技巧,我相信这些会对你有所帮助。

1. read_csv

这是读取数据的入门级命令。当要你所读取的数据量特别大时,试着加上这个参数nrows = 5,就可以在载入全部数据前先读取一小部分数据。如此一来,就可以避免选错分隔符这样的错误啦(数据不一定都是用逗号来分隔)。

(或者在linux系统中,你可以使用‘head'来展示任意文本文件的前五行:head -c 5 data.txt)

接下来,用 df.columns.tolist() 可以提取每一列并转换成list。还可以加上usecols = [‘c1', ‘c2', … ]来载入所需要的指定列。另外,如果你知道某些列的类型,你可以加上dtype = {‘c1': str, ‘c2': int, …} ,这样会加快载入的速度。加入这些参数的另一大好处是,如果这一列中同时含有字符串和数值类型,而你提前声明把这一列看作是字符串,那么这一列作为主键来融合多个表时,就不会报错了。

2. select_dtypes

如果已经在Python中完成了数据的预处理,这个命令可以帮你节省一定的时间。在读取了表格之后,每一列的默认数据类型将会是bool,int64,float64,object,category,timedelta64,或者datetime64。首先你可以观察一下大致情况,使用:

df.dtypes.value_counts()

来了解你的dataframe的每项数据类型,然后再使用:

df.select_dtypes(include=['float64', 'int64'])

获取一个仅由数值类型组成的sub-dataframe。

3. copy

如果你没听说过它的话,我不得强调它的重要性。输入下面的命令:

import pandas as pd 
df1 = pd.DataFrame({ 'a':[0,0,0], 'b': [1,1,1]}) 
df2 = df1 
df2['a'] = df2['a'] + 1 
df1.head()

你会发现df1已经发生了改变。这是因为df2 = df1并不是生成一个df1的复制品并把它赋值给df2,而是设定一个指向df1的指针。所以只要是针对df2的改变,也会相应地作用在df1上。为了解决这个问题,你既可以这样做:

df2 = df1.copy()

也可以这样做:

from copy import deepcopy 
df2 = deepcopy(df1)

4. map

这个炫酷的命令让你的数据转换变得轻松。首先定义一个

dictionary,“key”是转换前的旧值,而“values”是转换后的新值。

level_map = {1: 'high', 2: 'medium', 3: 'low'} 
df['c_level'] = df['c'].map(level_map)

几个适用情景:把True、False,转换成1、0(为了建模);定义级别;使用字典编码。

5. 用不用apply?

如果我们想在现有几列的基础上生成一个新列,并一同作为输入,那么有时apply函数会相当有帮助。

def rule(x, y): 
 if x == 'high' and y > 10: 
 return 1 
 else: 
 return 0 
df = pd.DataFrame({ 'c1':[ 'high' ,'high', 'low', 'low'], 'c2': [0, 23, 17, 4]}) 
df['new'] = df.apply(lambda x: rule(x['c1'], x['c2']), axis = 1) 
df.head()

在上面的代码中,我们定义了一个有两个输入变量的函数,并依靠apply函数使其作用到列“c1”和“c2”上。

但是apply函数在有些情况下实在是太慢了。如果你是想计算“c1”和“c2”列的最大值,你当然可以这样去做:

df['maximum'] = df.apply(lambda x: max(x['c1'], x['c2']), axis = 1)

但你会发现相比于以下命令,apply实在是慢太多了:

df['maximum'] = df[['c1','c2']].max(axis =1)

结论:如果你可以采用其他内置函数(他们一般速度更快),请不要使用apply。比如说,如果你想把“c”列的值近似取整,那么请用round(df[‘c'], 0)或df['c'],round(0)而不是上文的apply函数。

7. value counts

这个命令用于检查值的分布。你想要检查下“c”列中出现的值以及每个值所出现的频率,可以使用:

df['c'].value_counts(

下面是一些有用的小技巧/参数:

  • normalize = True:查看每个值出现的频率而不是频次数。
  • dropna = False: 把缺失值也保留在这次统计中。
  • sort = False: 将数据按照值来排序而不是按照出现次数排序。
  • df[‘c].value_counts().reset_index(): 将这个统计表转换成pandas的dataframe并且进行处理。

8. 缺失值的数量

当构建模型时,我们可能会去除包含过多缺失值或是全部是缺失值的行。这时可以使用.isnull()和.sum()来计算指定列缺失值的数量。

import pandas as pd 
import numpy as np 
df = pd.DataFrame({ 'id': [1,2,3], 'c1':[0,0,np.nan], 'c2': [np.nan,1,1]}) 
df = df[['id', 'c1', 'c2']] 
df['num_nulls'] = df[['c1', 'c2']].isnull().sum(axis=1) 
df.head()

在SQL中我们可以使用 SELECT * FROM … WHERE ID in (‘A001',‘C022', …)来获取含有指定ID的记录。如果你也想在Pandas中做类似的事情,你可以使用:

df_filter = df['ID'].isin(['A001','C022',...]) 
df[df_filter]

10. 基于分位数分组

面对一列数值,你想将这一列的值进行分组,比如说最前面的5%放入组别一,5-20%放入组别二,20%-50%放入组别三,最后的50%放入组别四。当然,你可以使用pandas.cut,但你也可以使用下面这种选择:

import numpy as np 
cut_points = [np.percentile(df['c'], i) for i in [50, 80, 95]] 
df['group'] = 1 
for i in range(3): 
 df['group'] = df['group'] + (df['c'] < cut_points[i]) 
# or <= cut_points[i]

这种方法的运行速度很快(并没有使用到apply函数)。

11. to_csv

这又是一个大家都会用的命令。我想在这里列出两个小技巧。首先是

print(df[:5].to_csv())

你可以使用这个命令打印出将要输出文件中的前五行记录。

另一个技巧是用来处理整数值和缺失值混淆在一起的情况。如果一列含有缺失值和整数值,那么这一列的数据类型会变成float而不是int。当导出表格时,你可以加上float_format=‘%.0f'以便将所有的浮点数近似成整数。当你想把所有列的输出值都变成整数格式时,就可以使用这个技巧,这样一来你就会告别所有数值后带“.0”的烦恼。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持三水点靠木。

Python 相关文章推荐
Python 两个列表的差集、并集和交集实现代码
Sep 21 Python
Python操作使用MySQL数据库的实例代码
May 25 Python
Python中Threading用法详解
Dec 27 Python
virtualenv 指定 python 解释器的版本方法
Oct 25 Python
pygame游戏之旅 添加icon和bgm音效的方法
Nov 21 Python
Django框架文件上传与自定义图片上传路径、上传文件名操作分析
May 10 Python
python实现列表的排序方法分享
Jul 01 Python
Python Numpy库常见用法入门教程
Jan 16 Python
使用celery和Django处理异步任务的流程分析
Feb 19 Python
Python+unittest+requests 接口自动化测试框架搭建教程
Oct 09 Python
python 利用PyAutoGUI快速构建自动化操作脚本
May 31 Python
python用海龟绘图写贪吃蛇游戏
Jun 18 Python
python制作图片缩略图
Apr 30 #Python
python获取微信企业号打卡数据并生成windows计划任务
Apr 30 #Python
使用Python实现企业微信的自动打卡功能
Apr 30 #Python
Python/Django后端使用PIL Image生成头像缩略图
Apr 30 #Python
Python3.5迭代器与生成器用法实例分析
Apr 30 #Python
python使用Paramiko模块实现远程文件拷贝
Apr 30 #Python
Django学习笔记之为Model添加Action
Apr 30 #Python
You might like
shopex主机报错误请求解决方案(No such file or directory)
2011/12/27 PHP
微信公众号开发之微信公共平台消息回复类实例
2014/11/14 PHP
深入理解PHP变量的值类型和引用类型
2015/10/21 PHP
最新版本PHP 7 vs HHVM 多角度比较
2016/02/14 PHP
js模拟弹出效果代码修正版
2008/08/07 Javascript
JS模拟的QQ面板上的多级可展开的菜单
2009/10/10 Javascript
JS 获取滚动条高度示例代码
2013/10/24 Javascript
JQuery Tips相关(1)----关于$.Ready()
2014/08/14 Javascript
jquery滚动加载数据的方法
2015/03/09 Javascript
JavaScript实现跑马灯抽奖活动实例代码解析与优化(一)
2016/02/16 Javascript
详谈javascript异步编程
2016/02/21 Javascript
AngularJS 基础ng-class-even指令用法
2016/08/01 Javascript
ES6新特性一: let和const命令详解
2017/04/20 Javascript
JS抛物线动画实例制作
2018/02/24 Javascript
微信小程序实现倒计时调用相机自动拍照功能
2018/06/10 Javascript
浅谈React之状态(State)
2018/09/19 Javascript
详解Vue调用手机相机和相册以及上传
2019/05/05 Javascript
[00:30]明星选手化身超级英雄!2018DOTA2亚洲邀请赛全明星赛来临!
2018/04/06 DOTA
Python映射拆分操作符用法实例
2015/05/19 Python
python 将list转成字符串,中间用符号分隔的方法
2018/10/23 Python
Python解析、提取url关键字的实例详解
2018/12/17 Python
Python查找数组中数值和下标相等的元素示例【二分查找】
2019/02/13 Python
tensorflow入门:tfrecord 和tf.data.TFRecordDataset的使用
2020/01/20 Python
Python tkinter实现简单加法计算器代码实例
2020/05/13 Python
Django模板标签{% for %}循环,获取制定条数据实例
2020/05/14 Python
简单了解Python字典copy与赋值的区别
2020/09/16 Python
测试时代收集的软件测试面试题
2013/09/25 面试题
介绍一下SOA和SOA的基本特征
2016/02/24 面试题
2014年祖国生日寄语
2014/09/19 职场文书
高二学年自我鉴定范文(2篇)
2014/09/26 职场文书
2015年乡镇扶贫工作总结
2015/04/08 职场文书
2016高考寄语或鼓励的话语
2015/12/04 职场文书
《追风筝的人》:人心中的成见是座大山,但请不忘初心
2019/11/15 职场文书
如何用python识别滑块验证码中的缺口
2021/04/01 Python
解决python绘图使用subplots出现标题重叠的问题
2021/04/30 Python
Mysql中一千万条数据怎么快速查询
2021/12/06 MySQL