Pandas 使用 0.21.0 对 FutureWarning 进行切片

Posted

技术标签:

【中文标题】Pandas 使用 0.21.0 对 FutureWarning 进行切片【英文标题】:Pandas slicing FutureWarning with 0.21.0 【发布时间】:2018-06-02 10:27:12 【问题描述】:

我正在尝试选择数据框子集的子集,仅选择一些列,然后对行进行过滤。

df.loc[df.a.isin(['Apple', 'Pear', 'Mango']), ['a', 'b', 'f', 'g']]

但是,我收到了错误:

Passing list-likes to .loc or [] with any missing label will raise
KeyError in the future, you can use .reindex() as an alternative.

现在切片和过滤的正确方法是什么?

【问题讨论】:

这不是错误,而是警告。但它告诉您的是您的标签之一,可能是您的列标签,不包含在数据框中。当前的行为将是静默失败并返回带有NaNs 的列。将来,它会引发错误。 谢谢,我误解了索引的含义 - 以及重新索引的相关性。是的,我只是在我的一个标签上打错了。 是的,我同意关于.reindex() 的那一点令人困惑。编辑虽然当您阅读 this 时它是有意义的 【参考方案1】:

TL;DR:列标题名称中可能存在拼写错误或拼写错误。

这是v0.21.1 中引入的更改,并已在docs 中详细解释-

以前,使用标签列表进行选择,其中一个或多个标签 丢失总是会成功,返回NaN 丢失标签。 现在将显示FutureWarning。未来,这将提高 KeyError (GH15747)。此警告将在 DataFrameSeries 用于在传递带有 at 的标签列表时使用 .loc[][[]] 至少缺少 1 个标签。

例如,

df

     A    B  C
0  7.0  NaN  8
1  3.0  3.0  5
2  8.0  1.0  7
3  NaN  0.0  3
4  8.0  2.0  7

在你做的时候尝试一些切片 -

df.loc[df.A.gt(6), ['A', 'C']]

     A  C
0  7.0  8
2  8.0  7
4  8.0  7

没问题。现在,尝试用不存在的列标签替换 C -

df.loc[df.A.gt(6), ['A', 'D']]
FutureWarning: Passing list-likes to .loc or [] with any missing label will raise
KeyError in the future, you can use .reindex() as an alternative.
     
     A   D
0  7.0 NaN
2  8.0 NaN
4  8.0 NaN

因此,在您的情况下,错误是因为您传递给loc 的列标签。再看看他们。

【讨论】:

如果我想要在缺少任何标签的情况下提出KeyError,该怎么办?也就是说,如果我真的想要新行为?现在.loc[list_of_names] 会给出这个警告,我不想看到。有什么方法可以禁用它? @OrenBen-Kiki 最简单的方法是更新到最新版本,它会在最新版本中抛出 KeyError。 是的,但它也会发出警告......目前我的选择是使用reindex(并失去loc给我的安全性),或者使用loc并获得大量的警告。是否有第三种选择(获得安全而获得警告)? @OrenBen-Kiki 就像我说的,在更新的版本中(至少 0.25,可能更早的版本),它会立即抛出 KeyError。现在我不确定您所说的“警告”是什么意思,您指的是回溯吗? @OrenBen-Kiki, @cs95 - 使用 JupyterLab 时,我需要使用 warnings.simplefilter('error', FutureWarning) 以获取 Traceback 并实际查看我的代码中的哪一段导致了 FutureWarning。 Reference【参考方案2】:

当列表包含新列时,.append 调用也会发生此错误。为了避免这种情况

用途:

df=df.append(pd.Series('A':i,'M':j), ignore_index=True)

而不是,

df=df.append(['A':i,'M':j], ignore_index=True)

完整的错误信息:

C:\ProgramData\Anaconda3\lib\site-packages\pandas\core\indexing.py:1472: FutureWarning:将列表喜欢传递给 .loc 或任何缺少的标签 将来会引发 KeyError,您可以使用 .reindex() 作为 替代。

感谢https://***.com/a/50230080/207661

【讨论】:

同样,如果你需要追加两个数据框,你可以使用df = df.append(pd.DataFrame([dict]), ignore_index=True) 正如问题标题所说,这是一个警告,而不是一个错误【参考方案3】:

如果你想保留索引,你可以传递列表推导而不是列列表:

loan_data_inputs_train.loc[:,[i for i in List_col_without_reference_cat]]

【讨论】:

【参考方案4】:

抱歉,我不确定我是否正确理解了您,但您似乎可以接受下一种方式:

df[df['a'].isin(['Apple', 'Pear', 'Mango'])][['a', 'b', 'f', 'g']]

片段描述:

df['a'].isin(['Apple', 'Pear', 'Mango']) # it's "filter" by data in each row in column *a*

df[['a', 'b', 'f', 'g']] # it's "column filter" that provide ability select specific columns set

【讨论】:

以上是关于Pandas 使用 0.21.0 对 FutureWarning 进行切片的主要内容,如果未能解决你的问题,请参考以下文章

pandas multiindex DataFrame中的圆形浮点数

FutureWarning: pandas.Int64Index is deprecated and will be removed ... in a future version. 解决方法

FutureWarning: pandas.Int64Index is deprecated and will be removed ... in a future version. 解决方法

Pandas 透视表pivot_table详解

已解决FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future

pip3安装熊猫挂起