在 Pandas 的多级索引中查找 NaN 值

7

我正在尝试查找两个不同形状的Pandas MultiIndex对象之间的区别。我已经使用了以下代码:

df1.index.difference(df2)

并且接收
TypeError: '<' not supported between instances of 'float' and 'str'

我的索引是字符串和日期时间,但我怀疑其中隐藏了NaN(浮点数)。因此,我的问题是:

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

2个回答

9
对于MultiIndex,许多函数都没有实现,您可以查看this
您需要先通过MultiIndex.to_frameMultiIndex转换为DataFrame
#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

或使用 DataFrame 构造函数:

print (pd.DataFrame(list(idx.tolist())))
     0  1
0  NaN  1
1  1.0  1
2  1.0  2

因为:
print (pd.isnull(idx))

NotImplementedError: MultiIndex未定义isna函数

编辑:

要检查每行至少有一个True,请使用anyboolean indexing

df = idx.to_frame()
print (df[df.isna().any(axis=1)])
        0  1
NaN 1 NaN  1

还可以对 MultiIndex 进行过滤,但需要添加 MultiIndex.remove_unused_levels

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

谢谢,这很好。一个非常简单的后续问题:我该如何对值为“真”的行进行筛选?(我的多级索引非常大) - Josh Friedlander

2
我们可以使用 reset_index,然后再使用isna
idx=pd.MultiIndex.from_tuples([(np.nan,1),(1,1),(1,2)])
df=pd.DataFrame([1,2,3],index=idx)
df.reset_index().filter(like='level_').isna()
Out[304]: 
   level_0  level_1
0     True    False
1    False    False
2    False    False

这很好 - 但是当我执行 reset_index 时,它不会在前面添加 level_(这是默认行为吗?),因此过滤器找不到任何内容。 - Josh Friedlander
@JoshFriedlander,由于我的索引没有名称,如果你的索引有名称,只需使用你的索引名称即可。 - BENY

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接