这是我遇到错误的方式:
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索引
这个错误消息的含义是什么?它会影响它返回的结果吗?
尽管有警告,您的方法仍然有效,但最好不要依赖隐含的,不明确的行为.
解决方案1,在a_list
布尔掩码中选择索引:
df[df.index.isin(a_list) & df.a_col.isnull()]
解决方案2,分两步完成:
df2 = df.loc[a_list] df2[df2.a_col.isnull()]
解决方案3,如果你想要一个单行,请使用这里找到的技巧:
df.loc[a_list].query('a_col != a_col')
警告来自这样的事实:布尔向量df.a_col.isnull()
是长度df
,而df.loc[a_list]
长度是a_list
,即更短.因此,有些指数df.a_col.isnull()
不在df.loc[a_list]
.pandas做的是在与调用数据帧相同的索引上重新索引布尔向量.实际上,它来自df.a_col.isnull()
对应于索引的值a_list
.这是有效的,但行为是隐含的,并且可能在将来很容易改变,因此这就是警告的内容.