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复数属性和方法运算操作示例
Jul 21 Python
Python中%是什么意思?python中百分号如何使用?
Mar 20 Python
Python实现针对给定字符串寻找最长非重复子串的方法
Apr 21 Python
Django框架的中的setting.py文件说明详解
Oct 15 Python
使用Python横向合并excel文件的实例
Dec 11 Python
python实现狄克斯特拉算法
Jan 17 Python
python模块常用用法实例详解
Oct 17 Python
利用python实现AR教程
Nov 20 Python
使用keras时input_shape的维度表示问题说明
Jun 29 Python
PyChon中关于Jekins的详细安装(推荐)
Dec 28 Python
Python提取PDF指定内容并生成新文件
Jun 09 Python
python使用BeautifulSoup 解析HTML
Apr 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
destoon后台网站设置变成空白的解决方法
2014/06/21 PHP
PHP高手需要要掌握的知识点
2014/08/21 PHP
PHP获取表单所有复选框的值的方法
2014/08/28 PHP
PHP使用finfo_file()函数检测上传图片类型的实现方法
2017/04/18 PHP
PDO::_construct讲解
2019/01/27 PHP
jQuery 动态酷效果实现总结
2009/12/27 Javascript
jQuery EasyUI API 中文文档 - ProgressBar 进度条
2011/09/29 Javascript
深入Javascript函数、递归与闭包(执行环境、变量对象与作用域链)使用详解
2013/05/08 Javascript
关于Javascript与iframe的那些事儿
2013/07/04 Javascript
javascript中的括号()用法小结
2014/04/14 Javascript
轻松创建nodejs服务器(4):路由
2014/12/18 NodeJs
《JavaScript DOM 编程艺术》读书笔记之JavaScript 图片库
2015/01/09 Javascript
基于JavaScript实现百叶窗动画效果不只单纯flas可以实现
2016/02/29 Javascript
jQuery回到顶部的代码
2016/07/09 Javascript
js实现各种复制到剪贴板的方法(分享)
2016/10/27 Javascript
详解nodejs 文本操作模块-fs模块(三)
2016/12/22 NodeJs
在百度搜索结果中去除掉一些网站的资料(通过js控制不让显示)
2017/05/02 Javascript
jQuery Validate格式验证功能实例代码(包括重名验证)
2017/07/18 jQuery
详解webpack2异步加载套路
2018/09/14 Javascript
Vue-cli3多页面配置详解
2020/03/22 Javascript
采用python实现简单QQ单用户机器人的方法
2014/07/03 Python
Python中使用语句导入模块或包的机制研究
2015/03/30 Python
下载python中Crypto库报错:ModuleNotFoundError: No module named ‘Crypto’的解决
2018/04/23 Python
python生成多个只含0,1元素的随机数组或列表的实例
2018/11/12 Python
使用python PIL库实现简单验证码的去噪方法步骤
2019/05/10 Python
python文件写入write()的操作
2019/05/14 Python
美国沙龙美发产品购物网站:Hair.com by L’Oreal
2020/11/09 全球购物
考试不及格检讨书
2014/01/09 职场文书
个人校本研修方案
2014/05/26 职场文书
房产分割协议书范文
2014/11/21 职场文书
2015年音乐教研组工作总结
2015/07/22 职场文书
2016年基层党组织公开承诺书
2016/03/25 职场文书
大学生入党自我鉴定范文
2019/06/21 职场文书
女人创业励志语录,句句蕴含能量,激发你的潜能
2019/08/20 职场文书
Python爬虫之自动爬取某车之家各车销售数据
2021/06/02 Python
关于JS中的作用域中的问题思考分享
2022/04/06 Javascript