布尔系列键将重新编制索引以匹配DataFrame索引

时间:2017-01-18 03:15:32

标签: python pandas

以下是我遇到错误的方法:

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 个答案:

答案 0 :(得分:35)

尽管有警告,你的方法仍然可行,但最好不要依赖隐含的,不明确的行为。

解决方案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 ,如果你想要一个单行,请使用找到的技巧here

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中的索引相对应的值。这是有效的,但行为是隐含的,并且将来很容易改变,所以这就是警告的内容。