2014-06-23 44 views
1

我有一个multindex删除行,其中multindex的水平楠(熊猫)

     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 
      . 
      . 
      . 
      . 

我想放弃的行,其中用户ID是南下表。如果我想放弃另一行我能做到

data = data.drop(1000000021) 

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

和其他企图都将返回不同品种的错误。有没有办法删除行而不必重新索引?

回答

0

您可以识别其索引是NaN使用df.index.labels[0] == -1行,并选择使用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[...]按标签通过布尔值掩码进行选择。但这只是我的惯例 - 熊猫允许所有三个。

+0

我已经试过这样的事情。 isnull没有为MultiIndex定义,所以命令会更像df.loc [〜pd.isnull(data.index.levels [0])],但这不起作用,因为返回的数组忽略NaN值。 – user262536

+0

哦,我误解了你的DataFrame。试试'df.loc [〜(df.index.labels [0] == -1)]'。 – unutbu

+0

运行。如果您正在计划建议df = df.loc [〜(df.index.labels [0] == np.nan)],它不起作用的原因与上述相同。 df.index.labels [0]数组不包含NaN值,因此我无法选择它。 – user262536

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