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检测一个对象是否为字符串类的方法
May 21 Python
Python实现FTP上传文件或文件夹实例(递归)
Jan 16 Python
Python 专题三 字符串的基础知识
Mar 19 Python
Python实现的密码强度检测器示例
Aug 23 Python
python 生成图形验证码的方法示例
Nov 11 Python
关于python之字典的嵌套,递归调用方法
Jan 21 Python
python Tkinter版学生管理系统
Feb 20 Python
详解Python中的各种转义符\n\r\t
Jul 10 Python
Python3.8对可迭代解包的改进及用法详解
Oct 15 Python
使用Python进行防病毒免杀解析
Dec 13 Python
Python matplotlib模块及柱状图用法解析
Aug 10 Python
利用python如何实现猫捉老鼠小游戏
Dec 04 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
建站常用13种PHP开源CMS比较
2009/08/23 PHP
PHP删除目录及目录下所有文件的方法详解
2013/06/06 PHP
php/JS实现的生成随机密码(验证码)功能示例
2019/06/06 PHP
Laravel开启跨域请求的方法
2019/10/13 PHP
js简易namespace管理器 实例代码
2013/06/21 Javascript
基于jquery实现的文字淡入淡出效果
2013/11/14 Javascript
javascript封装简单实现方法
2015/08/11 Javascript
jQuery Ajax 上传文件处理方式介绍(推荐)
2016/06/30 Javascript
Vue 过渡(动画)transition组件案例详解
2017/01/22 Javascript
jQuery+vue.js实现的九宫格拼图游戏完整实例【附源码下载】
2017/09/12 jQuery
JS实现websocket长轮询实时消息提示的效果
2017/10/10 Javascript
JS简单添加元素新节点的方法示例
2018/02/10 Javascript
30分钟快速入门掌握ES6/ES2015的核心内容(下)
2018/04/18 Javascript
详解Vue的钩子函数(路由导航守卫、keep-alive、生命周期钩子)
2018/07/24 Javascript
解决angularjs前后端分离调用接口传递中文时中文乱码的问题
2018/08/13 Javascript
微信小程序云开发之使用云存储
2019/05/17 Javascript
JavaScript中的函数式编程详解
2020/08/22 Javascript
[05:00]第二届DOTA2亚洲邀请赛主赛事第三天比赛集锦.mp4
2017/04/04 DOTA
Python列表推导式的使用方法
2013/11/21 Python
Python中time模块和datetime模块的用法示例
2016/02/28 Python
详解python执行shell脚本创建用户及相关操作
2019/04/11 Python
画pytorch模型图,以及参数计算的方法
2019/08/17 Python
PyTorch预训练的实现
2019/09/18 Python
Spring @Enable模块驱动原理及使用实例
2020/06/23 Python
详解python datetime模块
2020/08/17 Python
python实现感知机模型的示例
2020/09/30 Python
伦敦最受欢迎的蛋糕店:Konditor & Cook
2019/11/01 全球购物
世界上最大的乐谱选择:Sheet Music Plus
2020/01/18 全球购物
医学检验专业大学生求职信
2013/11/18 职场文书
十岁生日家长答谢词
2014/01/17 职场文书
黄金酒广告词
2014/03/21 职场文书
习近平在党的群众路线教育实践活动总结大会上的讲话全文
2014/10/25 职场文书
创建文明城市倡议书
2015/04/28 职场文书
导游词之香港-太平山顶
2019/10/18 职场文书
PyTorch 实现L2正则化以及Dropout的操作
2021/05/27 Python
GitHub上77.9K的Axios项目有哪些值得借鉴的地方详析
2021/06/15 Javascript