代码之家  ›  专栏  ›  技术社区  ›  Josh Friedlander

在大熊猫多指数中寻找NaN值

  •  4
  • Josh Friedlander  · 技术社区  · 6 年前

    我想找出两只熊猫的区别 MultiIndex 不同形状的物体。我曾经用过:

    df1.index.difference(df2)
    

    接收

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

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

    在多索引中查找nan的最佳方法是什么?如何迭代级别和名称?我能用像这样的东西吗 isna() ?

    2 回复  |  直到 6 年前
        1
  •  3
  •   jezrael    6 年前

    为了 MultiIndex 没有实现很多功能,可以检查 this .

    你需要转换 多指标 DataFrame 通过 MultiIndex.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
    

    或使用 数据文件 构造函数:

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

    因为:

    print (pd.isnull(idx))
    

    NotImplementedError:没有为多索引定义ISNA

    编辑:

    至少检查一次 True 每行使用 any 具有 boolean indexing :

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

    也可以过滤 多指标 ,但必须添加 MultiIndex.remove_unused_levels :

    print (idx[idx.to_frame().isna().any(axis=1)].remove_unused_levels())
    MultiIndex(levels=[[], [1]],
               labels=[[-1], [0]])
    
        2
  •  2
  •   BENY    6 年前

    我们可以使用 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