Pandas 已不允许使用“存在缺失标签的列表”进行索引(Indexing with list with missing labels is deprecated)
date
Apr 12, 2020
slug
pandas-index
status
Published
summary
为了 .reindex 这一方法,自 0.21.0开始,pandas 不再支持使用 .loc 或 [] 方法对存在一个或多个缺失标签的列表 (a list with one or more missing labels) 进行索引。
tags
Engineering
Data Analysis
type
Post
为了
.reindex
这一方法,自 0.21.0开始,pandas 不再支持使用 .loc
或 []
方法对存在一个或多个缺失标签的列表 (a list with one or more missing labels) 进行索引。Starting in 0.21.0, using .loc or [] with a list with one or more missing labels, is deprecated, in favor of .reindex. 引自官方文档
例如对这一 数据:
s = pd.Series([1, 2, 3])
In [99]: s
Out[99]:
0 1
1 2
2 3
dtype: int64
更改前
在此之前,我们可以直接:
s.loc[[1, 2, 3]]
得到:
Out[4]:
1 2.0
2 3.0
3 NaN
dtype: float64
在上面的操作中,尽管并不存在
3
这样一个索引,pandas 还是正确选取了存在的索引并用 NaN
对不存在的索引对应的值进行填充 (上述输出中的 3 NaN
)。更改后
现在我们只能得到:
In [4]: s.loc[[1, 2, 3]]
Passing list-likes to .loc with any non-matching elements will raise
KeyError in the future, you can use .reindex() as an alternative.
See the documentation here:
https://pandas.pydata.org/pandas-docs/stable/indexing.html#deprecate-loc-reindex-listlike
Out[4]:
1 2.0
2 3.0
3 NaN
dtype: float64
在这里 pandas 跑出了错误和解决指引。但是这个指引对不熟悉 pandas 的人来说并不友好,下面给出类似结果的简单操作。
简单实现相同的操作
在当前版本(>0.21.0),我们可以根据官方指引,使用
.reindex
得到相同结果:s.reindex([1, 2, 3])
在 DataFrame 中,也类似; 若需使用列而非行,则需要指定 axis:
df.reindex([1, 2, 3], axix=1) # 列
更多样例可参见原文档。
Pandas 真是更新狂魔。