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 做数据分析这事儿估计已经绝迹了吧!

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

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

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 也没问题。

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

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

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

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

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

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

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

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

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

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

触发 SpecificationError

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

3. 优化了 MultiIndex 显示输出

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

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

之前,是这样的

现在,是这样的

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

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)

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)

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

json_normalize(data, max_level= 1 )

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

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

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

df

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

以后再拆分这样的数据就简单多了。具体官方文档说明详见 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 以前输出的结果居然是这样的:

0.25以前

0.25以后

这样才正常嘛~~!

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

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

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

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

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

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

df = pd.DataFrame(data)

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

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

好了,本文就先介绍 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大好用的新功能,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对我们网站的支持!
如果你觉得本文对你有帮助,欢迎转载,烦请注明出处,谢谢!

(0)

相关推荐

  • 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 的朋友可要注意了,享受不了新功

  • 前端面试知识点锦集(JavaScript篇)

    JavaScript部分 1.谈谈你对Ajax的理解?(概念.特点.作用) AJAX全称为"Asynchronous JavaScript And XML"(异步JavaScript和XML) 是指一种创建交互式网页应用的开发技术.改善用户体验,实现无刷新效果. 优点 a.不需要插件支持 b.优秀的用户体验 c.提高Web程序的性能 d.减轻服务器和带宽的负担 缺点 a.浏览器对XMLHttpRequest对象的支持度不足,几乎所有浏览器现在都支持 b.破坏浏览器"前进&qu

  • 30个最好的jQuery 灯箱插件分享

    jQuery 是非常流行的JS框架,其俨然已成了开发者的必备工具,其中的jQuery Lightbox插件更是为广大开发者所喜爱.它惊人的特征之一是jQuery Lightbox插件有很多变化. 下面介绍30个最好的jQuery Lightbox 插件,别忘了收藏它,以防未来的设计中错过它们中的一个. 1. Fancy Zoom (jQuery) 几天前,John重写了Cabel Sasser的FancyZoom,在Prototype和Scriptaculous程序库上.我将它引入到jQuery

  • PowerShell入门教程之PowerShell有什么用?

    PowerShell能干什么呢?就像序言中提到的那样,PowerShell首先是个Shell,定义好了一堆命令与操作系统,特别是与文件系统交互,能够启动应用程序,甚至操纵应用程序:第二,PowerShell允许将几个命令组合起来放到文件里执行,实现文件级的重用,也就是说有脚本的性质:第三,PowerShell能够能够充分利用.Net类型和COM对象,来简单地与各种系统交互,完成各种复杂的.自动化的操作. 一.与文件系统交互.运行应用程序 就像在Dos中一样,在PowerShell的交互界面上键入

  • 从一个小需求感受Redis的独特魅力(需求设计)

    分享一个简单的小需求应该怎么设计实现以及有关Redis的使用 Redis在实际应用中使用的非常广泛,本篇文章就从一个简单的需求说起,为你讲述一个需求是如何从头到尾开始做的,又是如何一步步完善的.之前写过一篇<如何实现页面广告随时上下线.过期自动下线及到时自动上线>,也涉及到了Redis在项目中的实际应用,有兴趣的可以看一下. 需求 设定,现在我们有一个APP,产品新提出一个叫"程序员树洞"的功能,具体功能就不说了,其中这个功能有一点需要做的是在使用该功能时,如果是首次进入会

  • Python中实现一行拆多行和多行并一行的示例代码

    粉丝提问 今天粉丝提了下面这样一个问题,其中一个是"一行拆多行",另外一个是"多行并一行",貌似群友用power query已经解决了.但是基于Python怎么做呢?接着往下看. 一行拆多行 上面这个问题我会提供两个思路,供大家选择,当然肯定是越简单得越好.每一种方法中都有一些好用的技巧,希望大家能够好好学习. 1)方法一 下方代码中有很多重要的知识点,需要我们下去好好学习一下,我这里只提供解体思路,关于每个知识点怎么用,希望大家下去自行研究学习. Pandas.m

  • web2.0色系

    logoorange.com列举了web2.0网站的设计的主色调,对于关注2.0和设计的人员来说应该不错的. (PMS) C M Y K RGB Hex 100 0 0 51 0 #ffff7d 101 0 0 79 0 #ffff36 102 0 1 95 0 #fffc0d 103 0 3 100 18 #d1cb00 104 0 3 100 30 #b3ad00 105 0 3 100 50 #807c00 106 0 2 69 0 #fffa4f 107 0 4 79 0 #fff536

  • 详解基于 Nuxt 的 Vue.js 服务端渲染实践

    Vue.js 是目前最火热的前端框架之一,而 Nuxt.js 是针对 Vue.js 推出的服务端渲染框架,通过高度定制化的配置以及简洁的 API,开发者可以快速进行服务端渲染项目的开发,本文将对 Nuxt.js 框架做一个简要介绍. 服务端渲染 服务端渲染(Server Side Render)并不是一个新的概念,在单页应用(SPA)还没有流行起来的时候,页面就是通过服务端渲染好,并传递给浏览器的.当用户需要访问新的页面时,需要再次请求服务器,返回新的页面. 为了优化体验,开发者们开始选择采用

  • 基于使用paramiko执行远程linux主机命令(详解)

    paramiko是python的SSH库,可用来连接远程linux主机,然后执行linux命令或者通过SFTP传输文件. 关于使用paramiko执行远程主机命令可以找到很多参考资料了,本文在此基础上做一些封装,便于扩展与编写脚本. 下面直接给出代码: # coding: utf-8 import paramiko import re from time import sleep # 定义一个类,表示一台远端linux主机 class Linux(object): # 通过IP, 用户名,密码,

  • Java实现顺时针输出螺旋二维数组的方法示例

    最近看到一道有点意思的逻辑算法题,便着手实现一下.题目是要求打印 出N*N顺时针螺旋数组,规律如下: // 1 2 3 4 5 // 16 17 18 19 6 // 15 24 25 20 7 // 14 23 22 21 8 // 13 12 11 10 9 Java 实现示例代码如下: import java.util.Scanner; public class Main { public static void main(String[] args) { Scanner in = new

随机推荐