删除多重索引中某级为nan的行 (Pandas)

1 投票
2 回答
748 浏览
提问于 2025-04-18 10:45

我有一个带有多重索引的表格

                       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为Nan的那一行。如果我想删除另一行,我可以这样做

data = data.drop(1000000021)

但是

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

还有其他尝试都返回了不同类型的错误。有没有办法在不重新索引的情况下删除这一行?

2 个回答

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
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.locdf.iloc 就成了不错的选择。因为 df.iloc 主要是用来通过整数索引来选择的,所以你可能更倾向于用 df.loc[...] 来通过标签和布尔掩码来选择。不过这只是我的习惯,Pandas 其实允许你用这三种方式。

撰写回答