在 Pandas MultiIndex 中查找 NaN 值

Jos*_*der 6 python pandas

我试图找出两个MultiIndex不同形状的Pandas对象之间的区别。我用过:

df1.index.difference(df2)
Run Code Online (Sandbox Code Playgroud)

并接收

TypeError: '<' not supported between instances of 'float' and 'str'
Run Code Online (Sandbox Code Playgroud)

我的索引是 str 和 datetime,但我怀疑那里NaNs隐藏着(浮点数)。因此我的问题是:

在 MultiIndex 某处找到 NaN 的最佳方法是什么?如何遍历级别和名称?我可以使用类似的东西isna()吗?

jez*_*ael 7

对于MultiIndex没有实现的许多功能,您可以检查这个

你需要转换MultiIndexDataFrameMultiIndex.to_frame第一:

#W-B sample
idx=pd.MultiIndex.from_tuples([(np.nan,1),(1,1),(1,2)])

print (idx.to_frame())
         0  1
NaN 1  NaN  1
1   1  1.0  1
    2  1.0  2

print (idx.to_frame().isnull())
           0      1
NaN 1   True  False
1   1  False  False
    2  False  False
Run Code Online (Sandbox Code Playgroud)

或者使用DataFrame构造函数:

print (pd.DataFrame(list(idx.tolist())))
     0  1
0  NaN  1
1  1.0  1
2  1.0  2
Run Code Online (Sandbox Code Playgroud)

因为:

print (pd.isnull(idx))
Run Code Online (Sandbox Code Playgroud)

NotImplementedError: isna 没有为 MultiIndex 定义

编辑:

对于检查至少一个True每行使用anyboolean indexing

df = idx.to_frame()
print (df[df.isna().any(axis=1)])
        0  1
NaN 1 NaN  1
Run Code Online (Sandbox Code Playgroud)

也可以过滤MultiIndex,但有必要添加MultiIndex.remove_unused_levels

print (idx[idx.to_frame().isna().any(axis=1)].remove_unused_levels())
MultiIndex(levels=[[], [1]],
           labels=[[-1], [0]])
Run Code Online (Sandbox Code Playgroud)