deprecated:英文原义有不赞成和反对的意思,在编码文件中常用于标记某方法已不提倡使用和即将废弃,虽然暂时可用但后续不再更新。可用于类上、方法上、属性上或者参数。
为保证时效性,笔者将本地Pandas库更新到了最新的release版本:
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结果,其函数签名文档如下:
接收参数是两个序列类型(要求两个序列长度一致),分别对应行索引和列名,例如:
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。二者是同名函数,均是用于计算当前日期所属于全年中的第几周。举个例子:
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则是不改变调用者本身,而返回一个新的追加后的对象
举个例子:
## 列表中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 fro
即append函数不再提倡使用,而推荐替代方法concat。当然,这里的concat其实是比append功能更为强大的方法:其既可以用于纵向的追加,也可以实现横向的拼接。
04 其他
除了上述提到的三处deprecated,其他还有若干更新,例如保存excel文件的函数to_excel()中,写文件引擎参数不再提倡使用engine="xlwt",DataFrame索引不再使用["Float64Index", "Int64Index", "UInt64Index"]这三种类型等等。
整体来看,这些deprecated的特性一般是比较小众的用法;换句话说:一方面,常用的主流用法只会随着版本的更新越发完善和成熟,而不会列入deprecated;另一方面,如果一个函数因为种种原因被列入deprecated,但其功能又是刚需的话,那么一定会有相应的替代推荐用法。