以下是我遇到错误的方法:
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索引
此错误消息的含义是什么?它会影响它返回的结果吗?
答案 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
中的索引相对应的值。这是有效的,但行为是隐含的,并且将来很容易改变,所以这就是警告的内容。