以下是我遇到警告的方式:
df.loc[a_list][df.a_col.isnull()]
a_list
的类型是Int64Index
,它包含一个行索引列表。所有这些行索引都属于df
。df.a_col.isnull()
部分是我进行过滤所需的条件。
如果我单独执行以下命令,我不会收到任何警告:
df.loc[a_list]
df[df.a_col.isnull()]
但是如果我把它们放在一起df.loc[a_list][df.a_col.isnull()]
,我会得到警告消息(但我可以看到结果):
布尔系列键将被重新索引以匹配DataFrame索引
此警告消息的含义是什么?是否会影响返回的结果?
3条答案
按热度按时间vuv7lop31#
尽管有警告,你的方法还是会起作用的,但最好不要依赖于隐含的、不明确的行为。
方案1,将
a_list
中的索引选择为布尔掩码:方案2,分两步进行:
解决方案3,如果你想要一行,使用一个技巧找到here:
警告来自布尔向量
df.a_col.isnull()
的长度为df
,而df.loc[a_list]
的长度为a_list
,即因此,df.a_col.isnull()
中的一些索引不在df.loc[a_list]
中。pandas所做的是在调用 Dataframe 的索引上重新索引布尔序列。实际上,它从
df.a_col.isnull()
中获取对应于a_list
中索引的值。这是可行的,但是行为是隐含的,并且在将来很容易改变,所以这就是警告的内容。oknrviil2#
如果收到此警告,则使用
.loc[]
而不是[]
会抑制此警告。1对于OP中的特定情况,您可以链接
.loc[]
索引器:或在
query()
中使用and
链接所有条件:或者在
[]
中使用&
链接所有条件(如@IanS的帖子)。如果出现以下情况,则会出现此警告
1:如果我们看一下
[]
和loc[]
的源代码,从字面上看,当布尔掩码的索引是 Dataframe 索引的(弱)超集时,唯一的区别是[]
显示此警告(通过_getitem_bool_array
方法)而loc[]
不显示。jyztefdp3#
在遇到这个页面时,我通过查询完整的 Dataframe 收到了同样的错误,但使用的结果对子数据。
创建一个数据子集并存储在变量
sub_df
中:解决方案:
确保每次使用相同的 Dataframe (在我的例子中,只有
sub_df
):