Pandas0.25来了千万别错过这10大好用的新功能


Posted in Python onAugust 07, 2019

Pandas0.25来了千万别错过这10大好用的新功能

呆鸟云:“7 月 18 日,Pandas 团队推出了 Pandas 0.25 版,这就相当于 Python 3.8 啦,Python 数据分析师可别错过新版的好功能哦。”

安装 0.25 版: pip install pandas ,就可以了。

下面和大家一起看看新版 pandas 都有哪些改变。

一、四个置顶的警告!

从 0.25 起,pandas 只支持 Python 3.53 及以上版本了,不再支持 Python 2.7,还在使用 Python 2 的朋友可要注意了,享受不了新功能了,不过,貌似用 Python 2 做数据分析这事儿估计已经绝迹了吧!

Pandas0.25来了千万别错过这10大好用的新功能

下一版 pandas 将只支持 Python 3.6 及以上版本了,这是因为 f-strings 的缘故吗?嘿嘿。

Pandas0.25来了千万别错过这10大好用的新功能

彻底去掉了 Panel,N 维数据结构以后要用 xarray 了。说起来惭愧,呆鸟还没用过 Panel 呢,它怎么就走了。。。。

Pandas0.25来了千万别错过这10大好用的新功能

read_pickle()read_msgpack() ,只向后兼容到 0.20.3。上一篇文章刚介绍过 read_pickle() ,它就也要离我们而去了吗?-_-||

看完了这四大警告,咱们再看下 0.25 带来了哪些新东西。

二、新增功能

1. Groupby 的 命名聚合(Named Aggregation)

这可是个新功能,能直接为指定的聚合输出列命名。先创建一个 DataFrame 示例。

animals = pd.DataFrame({ '品种' : [ '猫' , '狗' , '猫' , '狗' ],   

'身高' : [ 9.1 , 6.0 , 9.5 , 34.0 ],   

'体重' : [ 7.9 , 7.5 , 9.9 , 198.0
]})

animals

命名聚合示例,居然还支持中文诶!不过,这里是为了演示清晰才写的中文变量名,平时,该用英文还是要用英文的。

animals.groupby( '品种'
).agg(
最低=pd.NamedAgg(column=
'身高' , aggfunc= 'min' 
),
最高=pd.NamedAgg(column=
'身高' , aggfunc= 'max' 
),
平均体重=pd.NamedAgg(column=
'体重' 
, aggfunc=np.mean),
)

这么写看起来还是有些繁琐,很不 Pythonic,好在 pandas 提供了更简单的写法,只需传递一个 Tuple 就可以了,Tuple 里的第一个元素是指定列,第二个元素是聚合函数,看看下面的代码,是不是少敲了好多下键盘:

animals.groupby( '品种'
).agg(
最低=(
'身高' 
, min),
最高=(
'身高' 
, max),
平均体重=(
'体重' 
, np.mean),
)

这里还可以进一步偷懒,只写 minmax ,连单引号都不写了。

Pandas 提供了一种叫 pandas.NameAgg 的命名元组( namedtuple ),但如上面的代码所示,直接使用 Tuple 也没问题。

这两段代码的效果是一样的,结果都如下图所示。

Pandas0.25来了千万别错过这10大好用的新功能

命名聚合取代了已经废弃的 dict-of-dicts 重命名方式,看了一下,之前的操作还真是挺复杂的,这里就不赘述了,有兴趣回顾的朋友,可以自己看下 用 dict 重命名 groupby.agg() 输出结果(已废弃) 这部分内容。

命名聚合还支持 Series 的 groupby 对象,因为 Series 无需指定列名,只要写清楚要应用的函数就可以了。

animals.groupby( '品种'
).身高.agg(
最低=min,
最高=max,
)

Pandas0.25来了千万别错过这10大好用的新功能

更多有关 命名聚合 的介绍,详见官方文档 Named aggregation 。

2. Groupby 聚合支持多个 lambda 函数

0.25 版有一个黑科技,以 list 方式向 agg() 函数传递多个 lambda 函数。为了减少键盘敲击量,真是无所不用其极啊!

animals.groupby( '品种' ).身高.agg([ 
lambda x: x.iloc[ 0 ], lambda x: x.iloc[ -1 
]
])

Pandas0.25来了千万别错过这10大好用的新功能

animals.groupby( '品种' ).agg([
lambda x: x.iloc[ 0 ] - x.iloc[ 1 ],
lambda x: x.iloc[ 0 ] + x.iloc[ 1 
]
])

Pandas0.25来了千万别错过这10大好用的新功能

0.25 版前,这样操作会触发 SpecificationError

Pandas0.25来了千万别错过这10大好用的新功能

触发 SpecificationError

这个功能也有个小遗憾,多 lambda 函数的输出没有像命名聚合那样可以自定义命名,还要后面手动修改,有些不方便,不知道是我没找到,还是真没有……

3. 优化了 MultiIndex 显示输出

MultiIndex 输出的每行数据以 Tuple 显示,且垂直对齐,这样一来, MultiIndex 的结构显示的更清晰了。

pd.MultiIndex.from_product([[ 'a' , 'abc' ], range( 500 )])

Pandas0.25来了千万别错过这10大好用的新功能

之前,是这样的

Pandas0.25来了千万别错过这10大好用的新功能

现在,是这样的

真是货比货得扔,以前没感觉,现在一比较,有没有觉得大不相同呢?

4. 精简显示 Series 与 DataFrame

超过 60 行的 Series 与 DataFrame,pandas 会默认最多只显示 60 行(见 display.max_rows 选项)。这种设置依然会占用大量垂直屏幕空间。因此,0.25 版引入了 display.min_rows 选项,默认只显示 10 行:

数据量小的 Series 与 DataFrame, 显示 max_row 行数据,默认为 60 行,前 30 行与后 30 行; 数据量大的 Series 与 DataFrame,如果数据量超过 max_rows , 只显示 min_rows 行,默认为 10 行,即前 5 行与后 5 行。

最大与最小行数这种双重选项,允许在数据量较小时,比如数据量少于 60 行,显示全部数据,在数据量较大时,则只显示数据摘要。

要去掉 min_rows 的设置,可以把该选项设置为 None

pd.options.display.min_rows = None

sales_date1 = pd.date_range( '20190101' , periods=1000, freq= 'D'
)
amount1 = np.arange(1000)
cols = [
'销售金额' 
]
sales1 = pd.DataFrame(amount1,index=sales_date1,columns=cols)

Pandas0.25来了千万别错过这10大好用的新功能

min_rows

在 VSCode 里显示正常,只显示了前 5 行与后 5 行,但貌似 Jupyter Notebook 6.0 目前貌似还不支持这个设置,还是显示前 30 行与后 30 行。图片太长,这里就不截图了。如果 Jupyter 可以的话,请告诉我。

5. json_normalize() 支持 max_level

json_normalize() 支持按层级(level)读取,增加了 max_level 控制参数。

from pandas.io.json import
json_normalize
data = [{
'CreatedBy' : { 'Name' : 'User001' },
'Lookup' : { 'TextField' : 'Some text' , 
'UserField' : { 'Id' : 'ID001' , 'Name' : 'Name001' }},
'Image' : { 'a' : 'b' 
}
}]

0.25 以前是这样的,所有层级都读取出来了:

json_normalize(data)

Pandas0.25来了千万别错过这10大好用的新功能

0.25 以后是这样的,可以通过 max_level 参数控制读取的 JSON 数据层级:

json_normalize(data, max_level= 1 )

Pandas0.25来了千万别错过这10大好用的新功能

6. 增加 explode() 方法,把 list “炸 ” 成行

Series 与 DataFrame 增加了 explode() 方法,把 list 形式的值转换为单独的行。

df = pd.DataFrame([{ '变量1' : 'a,b,c' , '变量2' : 1 
},
{
'变量1' : 'd,e,f' , '变量2' : 2 
}])

df

Pandas0.25来了千万别错过这10大好用的新功能

df.assign(变量 1 =df.变量 1. str.split( ',' )).explode( '变量1' )

Pandas0.25来了千万别错过这10大好用的新功能

以后再拆分这样的数据就简单多了。具体官方文档说明详见 section on Exploding list-like column 。

7. SparseDataFrame 被废弃了

0.25 以前专门有 SparseDataFrame() ,生成稀疏矩阵,0.25 以后,这个函数被废弃了,改成 pd.DataFrame 里的 pd.SparseArray() 了,函数统一了,但是要多敲几下键盘了。

0.25 以前是这样的:

pd.SparseDataFrame({ "A" : [0, 1]})

0.25 以后是这样的:

pd.DataFrame({ "A" : pd.SparseArray([0, 1])})

输出的结果都是一样的:

8. 对 DataFrame Groupby 后,Groupby.apply 对每组只处理一次

df = pd.DataFrame({ "a" : [ "x" , "y" ], "b" : [ 1 , 2
]})
df
def func (group) : print(group.name) return 
group
df.groupby(
'a' ).apply(func)

有没有想到,0.25 以前输出的结果居然是这样的:

Pandas0.25来了千万别错过这10大好用的新功能

0.25以前

Pandas0.25来了千万别错过这10大好用的新功能

0.25以后

这样才正常嘛~~!

9. 用 Dict 生成的 DataFrame,终于支持列排序啦

data = [
{
'姓 名' : '张三' , '城 市' : '北京' , '年 龄' : 18 
},
{
'姓 名' : '李四' , '城 市' : '上海' , '年 龄' : 19 , '爱 好' : '打游戏' 
},
{
'姓 名' : '王五' , '城 市' : '广州' , '年 龄' : 20 , '财务状况' : '优' 
}
]
pd.DataFrame(data)

以前是乱序的,全凭 pandas 的喜好:

Pandas0.25来了千万别错过这10大好用的新功能

现在,我的字典终于我做主了!

Pandas0.25来了千万别错过这10大好用的新功能

10. Query() 支持列名空格了

用上面的 data 生成一个示例 DataFrame,注意列名是有空格的。

df = pd.DataFrame(data)

现在用反引号(`)括住列名,就可以直接查询了:

df.query( '`年 龄` <19' )

Pandas0.25来了千万别错过这10大好用的新功能

好了,本文就先介绍 pandas 0.25 的这些改变,其实,0.25 还包括了很多优化,比如,对 DataFrame GroupBy 后 ffill , bfill 方法的调整,对类别型数据的 argsort 的缺失值排序, groupby 保留类别数据的数据类型等,如需了解,详见官方文档 What's new in 0.25.0 。

配套的 Jupyter Notebook 文件链接:

https://github.com/jaystone776/pandas_answered/blob/master/10_New_Features_in_Pandas_0.25.ipynb 。

总结

以上所述是小编给大家介绍的Pandas0.25来了千万别错过这10大好用的新功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对三水点靠木网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

Python 相关文章推荐
python使用scrapy解析js示例
Jan 23 Python
基于Python实现通过微信搜索功能查看谁把你删除了
Jan 27 Python
tensorflow TFRecords文件的生成和读取的方法
Feb 06 Python
Pandas标记删除重复记录的方法
Apr 08 Python
Sanic框架异常处理与中间件操作实例分析
Jul 16 Python
Python3基础教程之递归函数简单示例
Jun 07 Python
Python实现TCP通信的示例代码
Sep 09 Python
带你彻底搞懂python操作mysql数据库(cursor游标讲解)
Jan 06 Python
tensorflow之tf.record实现存浮点数数组
Feb 17 Python
Pycharm常用快捷键总结及配置方法
Nov 14 Python
python 爬虫之selenium可视化爬虫的实现
Dec 04 Python
pandas取dataframe特定行列的实现方法
May 24 Python
Python编程学习之如何判断3个数的大小
Aug 07 #Python
Python使用import导入本地脚本及导入模块的技巧总结
Aug 07 #Python
python可视化篇之流式数据监控的实现
Aug 07 #Python
Python+AutoIt实现界面工具开发过程详解
Aug 07 #Python
Django中的用户身份验证示例详解
Aug 07 #Python
浅谈Python中(&amp;,|)和(and,or)之间的区别
Aug 07 #Python
Python操作远程服务器 paramiko模块详细介绍
Aug 07 #Python
You might like
PHP ? EasyUI DataGrid 资料取的方式介绍
2012/11/07 PHP
php中JSON的使用与转换
2015/01/14 PHP
php多线程实现方法及用法实例详解
2015/10/26 PHP
PHP 二维数组和三维数组的过滤
2016/03/16 PHP
php微信公众号开发(2)百度BAE搭建和数据库使用
2016/12/15 PHP
PHP code 验证码生成类定义和简单使用示例
2020/05/27 PHP
javascript 时间比较实现代码
2009/10/28 Javascript
12款经典的白富美型—jquery图片轮播插件—前端开发必备
2013/01/08 Javascript
JavaScript的null和undefined区别示例介绍
2014/09/15 Javascript
js实现简易的单数字随机抽奖(0-9)
2020/03/19 Javascript
jQuery使用animate创建动画用法实例
2015/08/07 Javascript
JavaScript日期对象(Date)基本用法示例
2017/01/18 Javascript
vue富文本编辑器组件vue-quill-edit使用教程
2018/09/21 Javascript
js canvas实现写字动画效果
2018/11/30 Javascript
小程序云开发之用户注册登录
2019/05/18 Javascript
基于vue的video播放器的实现示例
2021/02/19 Vue.js
[02:07]DOTA2新英雄展现中国元素,完美“圣典”亮相央视
2016/12/19 DOTA
[41:17]VG vs Optic 2018国际邀请赛小组赛BO2 第二场 8.19
2018/08/21 DOTA
python使用urllib模块和pyquery实现阿里巴巴排名查询
2014/01/16 Python
用Python实现一个简单的多线程TCP服务器的教程
2015/05/05 Python
Python实现命令行通讯录实例教程
2016/08/18 Python
浅谈使用Python变量时要避免的3个错误
2017/10/30 Python
python查询mysql,返回json的实例
2018/03/26 Python
python安装twisted的问题解析
2018/08/21 Python
Python实现的序列化和反序列化二叉树算法示例
2019/03/02 Python
python中Lambda表达式详解
2019/11/20 Python
Pyside2中嵌入Matplotlib的绘图的实现
2021/02/22 Python
CSS3 实现穿梭星空动画
2020/11/13 HTML / CSS
分享全球十款超强HTML5开发工具
2014/05/14 HTML / CSS
使用HTML5中的contentEditable来将多行文本自动增高
2016/03/01 HTML / CSS
HTML5中外部浏览器唤起微信分享
2020/01/02 HTML / CSS
授权委托书范本
2014/04/03 职场文书
综治维稳工作汇报
2014/10/27 职场文书
《去年的树》教学反思
2016/02/18 职场文书
django如何自定义manage.py管理命令
2021/04/27 Python
JS前端宏任务微任务及Event Loop使用详解
2022/07/23 Javascript