前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >且用且珍惜:Pandas中的这些函数/属性将被deprecated

且用且珍惜:Pandas中的这些函数/属性将被deprecated

作者头像
luanhz
发布2022-09-19 11:35:55
1.4K0
发布2022-09-19 11:35:55
举报
文章被收录于专栏:小数志小数志

导读

Pandas对于日常数据分析和处理来说是最常用的工具(没有之一),笔者之前也总结分享了很多相关用法和技巧。与之不同,今天本文来介绍几个已经在函数文档中列入"deprecated"的函数/属性,可能在不久的未来版本中这些用法将正式与我们告别,以此权当留念。

deprecated:英文原义有不赞成和反对的意思,在编码文件中常用于标记某方法已不提倡使用和即将废弃,虽然暂时可用但后续不再更新。可用于类上、方法上、属性上或者参数。

为保证时效性,笔者将本地Pandas库更新到了最新的release版本:

代码语言:javascript
复制
import pandas as pd
pd.__version__
# '1.4.1'

而后,通过vscode打开Pandas安装源码文件夹,全局搜索"deprecated"关键字得到如下结果:

基于全局检索,约有700+处"deprecated"

查找"deprecated"结果数量还是比较庞大的,约有762处命中结果并分布于224个文件中,大体浏览一下可分属于三类:

  • 变量命名相关。即Pandas内部编码为了标记deprecated相关信息,部分变量名包含了deprecated字样,例如:
  • 弃用的函数/方法,表明某函数/方法整体已遭弃用,使用者调用该函数/方法时,直接触发相关warning提示。(ps.:单独def的叫函数,在类里def的叫方法)
  • 弃用的参数,即虽然某一函数/方法仍在维护和使用,但其中的某一项参数不再提倡使用,当使用该函数的相应参数时触发相关warning

结合笔者对Pandas的使用习惯,经过对700多处"deprecated"关键字快速浏览,认为整体上对日常使用影响不大,但也有几处用法值得关注,本文简要介绍一下。

01 lookup函数

Pandas作为一款定位于数据分析与处理的工具库,所以在其API方面常能看到一些其他工具的影子:例如类似SQL的join函数,类似Excel中的lookup函数等。而现在,lookup函数已进入了Pandas的deprecated之列。

具体来说,类似于Excel中的lookup的功能一样,Pandas中的lookup是一个DataFrame对象的方法,用于指定行索引和列名来查找相应结果,返回一个array结果,其函数签名文档如下:

接收参数是两个序列类型(要求两个序列长度一致),分别对应行索引和列名,例如:

代码语言:javascript
复制
df = pd.DataFrame({
    "A":range(3),
    "B":list("abc")
})
df.head()
"""
  A  B
0  0  a
1  1  b
2  2  c
"""
df.lookup((1, 2), ("A", "A"))  # 行索引分别为1和2,列名均为"A"
# FutureWarning: The 'lookup' method is deprecated and will be removed in a future version. You can use DataFrame.melt and DataFrame.loc as a substitute.
# array([1, 2], dtype=int64)

当调用该函数时,给出了deprecated的提示,并建议使用df.melt或df.loc函数。不过实话说,这个函数在deprecated之前,其实也并没有太大的用处,一方面其功能完全可由.loc替代,另一方面这个lookup相较于Excel中的lookup函数的功能可要逊色许多!

02 dt.weekofyear属性

在Pandas中有一个非常好用的特性,叫做属性提取器(accessor),目前包括.str、.dt、.cat和.sparse四大类,不熟悉相关用法的可查看历史推文Panda处理文本和时序数据?首选向量化

其中,对于时间列就可以通过.dt属性调用很多方法,对于向量化操作是非常方便的。在这一系列方法中,也有两个方法进入了deprecated之列,即:.dt.weekofyear和.dt.week。二者是同名函数,均是用于计算当前日期所属于全年中的第几周。举个例子:

代码语言:javascript
复制
df = pd.DataFrame({
    "A":pd.date_range("2022-03-01", "2022-03-21", periods=3)
})
df.head()
"""
   A
0  2022-03-01
1  2022-03-11
2  2022-03-21
"""
df['A'].dt.weekofyear
# FutureWarning: Series.dt.weekofyear and Series.dt.week have been deprecated. Please use Series.dt.isocalendar().week instead.
======输出======
0     9
1    10
2    12
Name: A, dtype: int64

上述代码返回了三个日期所属的周数,同时也触发了相应的deprecated warning。如果说lookup的功能还略显鸡肋的话,那么weekofyear的功能其实还是有用的,上述warning中也给出了相应的替代函数:.dt.isocalendar().week,其中直接调用.dt.isocalendar()函数时返回一个三列的dataframe,分别表示年、周和日信息,进一步取其week列即可实现weekofyear的效果。

03 append函数

如果说上述两个函数在日常使用还不够频繁的话,那么append这个函数使用还是比较多的,一方面源于其函数功能的实用性,另一方面也源于其函数名的直观。

类似于Python中列表的append函数,Pandas中的append函数是用于在现有对象的尾部追加新的元素,既可以是对Series追加Series,也可以是在DataFrame后面追加DataFrame。但同时,也与Python中列表的append函数大为不同的是:

  • 列表中的append是inplace型的方法,即对当前对象直接追加,而返回加过为None;
  • Pandas中的append则是不改变调用者本身,而返回一个新的追加后的对象

举个例子:

代码语言:javascript
复制
## 列表中append
a = [1, 2]
a.append(3)
# 不输出任何结果
print(a)
# [1, 2, 3]
## Pandas中的append
df = pd.DataFrame({
    "A":range(2),
    "B":list("ab")
})
df.append(df)
# 输出追加后的DataFrame,而原df不变
"""
   A  B
0  0  a
1  1  b
0  0  a
1  1  b
"
# 这里也触发deprecated warning
# FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future version. Use pandas.concat instead.

即append函数不再提倡使用,而推荐替代方法concat。当然,这里的concat其实是比append功能更为强大的方法:其既可以用于纵向的追加,也可以实现横向的拼接。

04 其他

除了上述提到的三处deprecated,其他还有若干更新,例如保存excel文件的函数to_excel()中,写文件引擎参数不再提倡使用engine="xlwt",DataFrame索引不再使用["Float64Index", "Int64Index", "UInt64Index"]这三种类型等等。

整体来看,这些deprecated的特性一般是比较小众的用法;换句话说:一方面,常用的主流用法只会随着版本的更新越发完善和成熟,而不会列入deprecated;另一方面,如果一个函数因为种种原因被列入deprecated,但其功能又是刚需的话,那么一定会有相应的替代推荐用法

相关阅读:

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-03-22,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 小数志 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档