在Pandas MultiIndex中查找NaN值

时间:2019-01-07 15:09:54

标签: python pandas

我正在尝试查找两个形状不同的熊猫MultiIndex对象之间的区别。我用过:

df1.index.difference(df2)

并接收

TypeError: '<' not supported between instances of 'float' and 'str'

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

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

2 个答案:

答案 0 :(得分:3)

对于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]])

答案 1 :(得分:2)

我们可以使用foo <- c("H2_2months_abc_456_S123_L001_R1_001") my_foo <- function(s) { s <- gsub(pattern="_(S[0-9+])", replacement="-\\1", x=s) split <- unlist(strsplit(s, "-")) split_1 <- split[-length(split)] split_1 <- gsub("_", "-", split_1) paste0(split_1, "-", split[length(split)]) } my_foo(foo) #[1] "H2-2months-abc-456-S123_L001_R1_001" ,然后使用reset_index

isna