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

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

640.jpg

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


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


import pandas as pd
pd.__version__
# '1.4.1'


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


640.png

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


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

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


640.png


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


640.png


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


640.png


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


01 lookup函数


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


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


640.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四大类,不熟悉相关用法的可查看历史推文Panda处理文本和时序数据?首选向量化


640.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 fro


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


04 其他


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


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

640.png

目录
相关文章
|
8天前
|
存储 数据挖掘 数据处理
Pandas中explode()函数的应用与实战
Pandas中explode()函数的应用与实战
14 0
|
8天前
|
数据挖掘 数据处理 索引
python常用pandas函数nlargest / nsmallest及其手动实现
python常用pandas函数nlargest / nsmallest及其手动实现
37 0
|
8天前
|
人工智能 数据处理 计算机视觉
Pandas数据处理——渐进式学习、DataFrame(函数检索-请使用Ctrl+F搜索)
Pandas数据处理——渐进式学习、DataFrame(函数检索-请使用Ctrl+F搜索)
80 0
|
9月前
|
索引 Python
Pandas中DataFrame的属性、方法、常用操作以及使用示例(四)
Pandas中DataFrame的属性、方法、常用操作以及使用示例(四)
|
8天前
|
数据处理 索引 Python
使用pandas的merge()和join()函数进行数据处理
使用pandas的merge()和join()函数进行数据处理
30 2
|
8天前
|
机器学习/深度学习 存储 算法
Pandas中的get_dummies()函数实战应用详解
Pandas中的get_dummies()函数实战应用详解
13 1
|
8天前
|
NoSQL Serverless Python
在Python的Pandas中,可以通过直接赋值或使用apply函数在DataFrame添加新列。
【5月更文挑战第2天】在Python的Pandas中,可以通过直接赋值或使用apply函数在DataFrame添加新列。方法一是直接赋值,如`df['C'] = 0`,创建新列C并初始化为0。方法二是应用函数,例如定义`add_column`函数计算A列和B列之和,然后使用`df.apply(add_column, axis=1)`,使C列存储每行A、B列的和。
50 0
|
8天前
|
人工智能 数据挖掘 Python
Python pandas中read_csv函数的io参数
Python pandas中read_csv函数的io参数
27 5
|
8天前
|
数据处理 数据格式 Python
python进行数据处理——pandas的drop函数
python进行数据处理——pandas的drop函数
|
8天前
|
Python
在Python中,pandas库的`get_dummies`函数
在Python中,pandas库的`get_dummies`函数
134 2