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下singleton模式的实现方法
Jul 16 Python
Python实现的中国剩余定理算法示例
Aug 05 Python
Caffe均值文件mean.binaryproto转mean.npy的方法
Jul 09 Python
Python理解递归的方法总结
Jan 28 Python
pyqt5利用pyqtDesigner实现登录界面
Mar 28 Python
python飞机大战pygame游戏框架搭建操作详解
Dec 17 Python
PyCharm无法引用自身项目解决方式
Feb 12 Python
python中对二维列表中一维列表的调用方法
Jun 07 Python
Python3使用 GitLab API 进行批量合并分支
Oct 15 Python
Python reversed反转序列并生成可迭代对象
Oct 22 Python
Python Unittest原理及基本使用方法
Nov 06 Python
python抢购软件/插件/脚本附完整源码
Mar 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
php+mysql大量用户登录解决方案分析
2014/12/29 PHP
PHP封装的数据库保存session功能类
2016/07/11 PHP
php实现带读写分离功能的MySQL类完整实例
2016/07/28 PHP
PHP创建文件及写入数据(覆盖写入,追加写入)的方法详解
2019/02/15 PHP
php生成HTML文件的类方法
2019/10/11 PHP
lib.utf.js
2007/08/21 Javascript
ExtJS 2.0实用简明教程 之Ext类库简介
2009/04/29 Javascript
有关于eclipse配置spket需要注意的一些地方
2013/04/07 Javascript
jQuery中element选择器用法实例
2014/12/29 Javascript
jquery操作angularjs对象
2015/06/26 Javascript
学习JavaScript设计模式之中介者模式
2016/01/14 Javascript
Jquery轮播效果实现过程解析
2016/03/30 Javascript
从0开始学Vue
2016/10/27 Javascript
详解js界面跳转与值传递
2016/11/22 Javascript
BootStrap Table 获取同行不同列元素的方法
2016/12/19 Javascript
详解Angular-Cli中引用第三方库
2017/05/21 Javascript
vue左右侧联动滚动的实现代码
2018/06/06 Javascript
javascript显示动态时间的方法汇总
2018/07/06 Javascript
JS实现十分钟倒计时代码实例
2018/10/18 Javascript
今天,小程序正式支持 SVG
2019/04/20 Javascript
vue改变对象或数组时的刷新机制的方法总结
2019/04/24 Javascript
JavaScript 作用域实例分析
2019/10/02 Javascript
[01:05:59]Mineski vs Secret 2019国际邀请赛淘汰赛 败者组 BO3 第二场 8.22
2019/09/05 DOTA
[40:27]完美世界DOTA2联赛PWL S3 PXG vs GXR 第一场 12.19
2020/12/24 DOTA
python抓取网页图片示例(python爬虫)
2014/04/27 Python
python实现复制整个目录的方法
2015/05/12 Python
python清理子进程机制剖析
2017/11/23 Python
python 动态生成变量名以及动态获取变量的变量名方法
2019/01/20 Python
解析python 类方法、对象方法、静态方法
2020/08/15 Python
高中生毕业自我鉴定范文
2013/12/22 职场文书
晚会邀请函范文
2014/01/24 职场文书
2014年乡镇个人工作总结
2014/12/03 职场文书
学校2014年度工作总结
2014/12/06 职场文书
企业宣传稿范文
2015/07/23 职场文书
详解Python函数print用法
2021/06/18 Python
GoFrame框架数据校验之校验结果Error接口对象
2022/06/21 Golang