在MultiIndex中删除带有重复项的NaN行

时间:2017-09-11 20:12:04

标签: python pandas dataframe nan multi-index

使用重新解决我的确切问题的DataFrame进行了更新

我遇到一个问题,即我的索引中出现的NaN导致非唯一行(自NaN !== NaN起)。我需要删除索引中出现NaN的所有行。我之前的问题有一个带有单NaN行的DataFrame示例,但是原始解决方案没有解决我的问题,因为它没有满足这个广告宣传的要求:

  

(请注意,在实际数据中,我有数千个这样的行,包括自NaN !== NaN以来的重复行,所以这在索引上是允许的)

(来自我的原帖)

问题

>>>import pandas as pd
>>>import numpy as np
>>> df = pd.DataFrame([[1,1,"a"],[1,2,"b"],[1,3,"c"],[1,np.nan,"x"],[1,np.nan,"x"],[1,np.nan,"x"],[2,1,"d"],[2,2,"e"],[np.nan,1,"x"],[np.nan,2,"x"],[np.nan,1,"x"]], columns=["a","b","c"])
>>>df
         c
a   b
1.0 1.0  a
    2.0  b
    3.0  c
    NaN  x
    NaN  x
    NaN  x
2.0 1.0  d
    2.0  e
NaN 1.0  x
    2.0  x
    1.0  x

请注意重复的行:(1.0, NaN)(NaN, 1.0)

失败的解决方案:

我尝试过一些简单的事情:

>>>df = df[pandas.notnull(df.index)]

但是这失败了,因为MultiIndex没有实现notnull

早期答案之一也提出:

>>>df = df.reindex(df.index.dropna())

然而,由于错误而失败:

Exception: cannot handle a non-unique multi-index!

期望的输出:

>>>df
         c
a   b
1.0 1.0  a
    2.0  b
    3.0  c
2.0 1.0  d
    2.0  e

(删除所有NaN索引行,消除任何非唯一行)

1 个答案:

答案 0 :(得分:2)

选项1
reset_index dropna set_index

c = df.index.names
df = df.reset_index().dropna().set_index(c)
df

         c
a   b     
1.0 1.0  a
    2.0  b
    3.0  c
2.0 1.0  d
    2.0  e
    2.0  x
    1.0  x

如果您的MultiIndex是唯一的,则可以使用...
选项2
df.index.dropna df.reindex

df = df.reindex(df.index.dropna())