作者 | luanhz

来源丨小数志

导读

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

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

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

其中,对于时间列就可以通过.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

"

# 这里也触发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,但其功能又是刚需的话,那么 一定会有相应的替代推荐用法

发布于:江苏