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使用Mechanize模块编写爬虫的要点解析
Mar 31 Python
Java多线程编程中ThreadLocal类的用法及深入
Jun 21 Python
Python对文件和目录进行操作的方法(file对象/os/os.path/shutil 模块)
May 08 Python
Python实现的科学计算器功能示例
Aug 04 Python
pandas 读取各种格式文件的方法
Jun 22 Python
详解python中list的使用
Mar 15 Python
python使用递归的方式建立二叉树
Jul 03 Python
python与mysql数据库交互的实现
Jan 06 Python
Django 允许局域网中的机器访问你的主机操作
May 13 Python
学习python需要有编程基础吗
Jun 02 Python
Pycharm Available Package无法显示/安装包的问题Error Loading Package List解决
Sep 18 Python
全网最细 Python 格式化输出用法讲解(推荐)
Jan 18 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 7编译安装错误:cannot stat ‘phar.phar’: No such file or directory
2017/02/25 PHP
PHP7创建COOKIE和销毁COOKIE的实例方法
2020/02/03 PHP
Jquery.LazyLoad.js修正版下载,实现图片延迟加载插件
2011/03/12 Javascript
修复IE9&amp;safari 的sort方法
2011/10/21 Javascript
jquery怎样实现ajax联动框(一)
2013/03/08 Javascript
js禁止document element对象选中文本实现代码
2013/03/21 Javascript
js confirm()方法的使用方法实例
2013/07/13 Javascript
jquery中map函数与each函数的区别实例介绍
2014/06/23 Javascript
js实现数字每三位加逗号的方法
2015/02/05 Javascript
再谈JavaScript线程
2015/07/10 Javascript
全面接触神奇的Bootstrap导航条实战篇
2016/08/01 Javascript
JS提示:Uncaught SyntaxError:Unexpected token ) 错误的解决方法
2016/08/19 Javascript
原生JS实现首页进度加载动画
2016/09/14 Javascript
巧用weui.topTips验证数据的实例
2017/04/17 Javascript
JavaScript 自定义事件之我见
2017/09/25 Javascript
JS设计模式之观察者模式实现实时改变页面中金额数的方法
2018/02/05 Javascript
JS 实现获取验证码 倒计时功能
2018/10/29 Javascript
python分割和拼接字符串
2013/11/01 Python
Python实现给qq邮箱发送邮件的方法
2015/05/28 Python
在Linux系统上通过uWSGI配置Nginx+Python环境的教程
2015/12/25 Python
Python解惑之True和False详解
2017/04/24 Python
Python中标准库OS的常用方法总结大全
2017/07/19 Python
python下载图片实现方法(超简单)
2017/07/21 Python
pycharm: 恢复(reset) 误删文件的方法
2018/10/22 Python
python IDLE 背景以及字体大小的修改方法
2019/07/12 Python
python 多进程并行编程 ProcessPoolExecutor的实现
2019/10/11 Python
html5教你做炫酷的碎片式图片切换 (canvas)
2017/07/28 HTML / CSS
AmazeUI 单选框和多选框的实现示例
2020/08/18 HTML / CSS
英国儿童图书网站:Scholastic
2017/03/26 全球购物
Linux机考试题
2015/07/17 面试题
2014机关党员干部“正风肃纪”思想汇报
2014/09/15 职场文书
群众路线党员个人剖析材料
2014/10/08 职场文书
煤矿隐患排查制度
2015/08/05 职场文书
青年志愿者活动感想
2015/08/07 职场文书
2016师德师风学习心得体会
2016/01/12 职场文书
php 防护xss,PHP的防御XSS注入的终极解决方案
2021/04/01 PHP