2014-06-23 45 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