我正在尝试查找两个形状不同的熊猫MultiIndex
对象之间的区别。我用过:
df1.index.difference(df2)
并接收
TypeError: '<' not supported between instances of 'float' and 'str'
我的索引是str和datetime,但是我怀疑那里有NaNs
隐藏(浮点数)。因此,我的问题是:
在MultiIndex中某个地方找到NaN的最佳方法是什么?如何遍历各个级别和名称?我可以使用类似isna()
的东西吗?
答案 0 :(得分:3)
对于MultiIndex
尚未实现的许多功能,可以检查this。
您需要先通过MultiIndex.to_frame
将MultiIndex
转换为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
,请使用any
和boolean 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