删除多索引级别为nan的行(Pandas)

时间:2014-06-23 12:03:19

标签: python pandas

我有下表和多索引

                       value
userid     date

NaN        2014-06-12   42799
           2014-06-13   47673
           2014-06-14   47042
           2014-06-15   48079
           2014-06-16   44873
           2014-06-17   46586
           2014-06-18   44575
1000000021 2014-06-17   0
1000000024 2014-06-22   20
1000000043 2014-06-12   14
           2014-06-14   22
          .
          .
          .
          .

我想删除用户标识为Nan的行。如果我想放弃另一行我可以做

data = data.drop(1000000021)

但是

data = data.drop('NaN')
data = data.drop(np.nan)

和其他尝试都会返回不同种类的错误。有没有办法放弃行而不必重新索引?

2 个答案:

答案 0 :(得分:0)

您可以使用df.index.labels[0] == -1标识索引为NaN的行,并使用df.loc选择其他行:

In [48]: df.loc[~(df.index.labels[0] == -1)]
Out[48]: 
                       value
userid     date             
1000000021 2014-06-17      0
1000000024 2014-06-22     20
1000000043 2014-06-12     14
           2014-06-14     22

使用布尔索引时,df[...]df.loc[...]df.iloc[...]的行为都相同。但是,df[...]通常用于选择列,因此您可能希望避免使用df[...]来选择行,如上所述。这使得df.locdf.iloc成为可行的选择。由于df.iloc主要是为了通过整数索引进行选择而创建的,因此您可能希望使用df.loc[...]通过布尔掩码选择标签。但这只是我的惯例 - 熊猫允许所有这三个。

答案 1 :(得分:0)

更容易从帧中重置和删除,然后设置索引。

In [3]: df =  DataFrame(np.random.randint(0,10,size=16).reshape(-1,1),columns=['value'],index=pd.MultiIndex.from_product([[np.nan,1,2,3],pd.date_range('20130101',periods=4)],names=['first','second']))

In [4]: df
Out[4]: 
                  value
first second           
NaN   2013-01-01      0
      2013-01-02      2
      2013-01-03      9
      2013-01-04      3
1     2013-01-01      8
      2013-01-02      8
      2013-01-03      5
      2013-01-04      3
2     2013-01-01      4
      2013-01-02      1
      2013-01-03      2
      2013-01-04      7
3     2013-01-01      3
      2013-01-02      9
      2013-01-03      3
      2013-01-04      4

In [5]: df.reset_index().dropna(subset=['first']).set_index(['first','second'])
Out[5]: 
                  value
first second           
1     2013-01-01      8
      2013-01-02      8
      2013-01-03      5
      2013-01-04      3
2     2013-01-01      4
      2013-01-02      1
      2013-01-03      2
      2013-01-04      7
3     2013-01-01      3
      2013-01-02      9
      2013-01-03      3
      2013-01-04      4