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.
现在切片和过滤的正确方法是什么?
【问题讨论】:
这不是错误,而是警告。但它告诉您的是您的标签之一,可能是您的列标签,不包含在数据框中。当前的行为将是静默失败并返回带有NaN
s 的列。将来,它会引发错误。
谢谢,我误解了索引的含义 - 以及重新索引的相关性。是的,我只是在我的一个标签上打错了。
是的,我同意关于.reindex()
的那一点令人困惑。编辑虽然当您阅读 this 时它是有意义的
【参考方案1】:
TL;DR:列标题名称中可能存在拼写错误或拼写错误。
这是v0.21.1
中引入的更改,并已在docs 中详细解释-
以前,使用标签列表进行选择,其中一个或多个标签 丢失总是会成功,返回
NaN
丢失标签。 现在将显示FutureWarning
。未来,这将提高KeyError
(GH15747)。此警告将在DataFrame
或Series
用于在传递带有 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. 解决方法
已解决FutureWarning: The frame.append method is deprecated and will be removed from pandas in a future