Pandas 中的这些函数/属性将被 deprecated

712dea09edeab44633bdecd220aa04ff.gif

作者 | luanhz

来源丨小数志

导读

Pandas对于日常数据分析和处理来说是最常用的工具(没有之一),笔者之前也总结分享了很多相关用法和技巧。

与之不同,今天本文来介绍几个已经在函数文档中列入"deprecated"的函数/属性,可能在不久的未来版本中这些用法将正式与我们告别,以此权当留念。

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

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

import pandas as pd
pd.__version__
# '1.4.1'

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

fbc5ea1edc5657f44b8a98da7d9b5e00.png

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

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

  • 变量命名相关。即Pandas内部编码为了标记deprecated相关信息,部分变量名包含了deprecated字样,例如:

7da965748148bfab887ee959dd67e11a.png

  • 弃用的函数/方法,表明某函数/方法整体已遭弃用,使用者调用该函数/方法时,直接触发相关warning提示。(ps.:单独def的叫函数,在类里def的叫方法)

60f836a9bda8608bdd60e9253a8b4303.png

  • 弃用的参数,即虽然某一函数/方法仍在维护和使用,但其中的某一项参数不再提倡使用,当使用该函数的相应参数时触发相关warning

16abcd1c6ce504e32320eac22c781593.png

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

01 lookup函数

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

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

fb60fee3896e88921d1eda590ccf8f5c.png

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

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四大类。

db7048e929af4c891734372865ecb27d.png

其中,对于时间列就可以通过.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 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,但其功能又是刚需的话,那么一定会有相应的替代推荐用法

8b1ebf5fa46a4b3b3be2ff8b540106e0.gif

技术

Pandas&SQL语法归纳总结

资讯

Nginx宣布在俄罗斯禁止贡献

资讯

2022人工智能开启未来新密码

技术

一行Python代码能干嘛?来看!

b6bf28a6f90b8fa2c2de24122546f6cb.png

分享

fac4e67cb476a0e33e3ae09dcc258a02.png

点收藏

3b85e3837c430caeb338b3e340be1e8b.png

点点赞

adf85732fe77c986633e055b576b8963.png

点在看

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值