【问题标题】:Pandas: drop rows with nan-valued indexPandas:删除具有 nan 值索引的行
【发布时间】:2018-06-20 09:08:40
【问题描述】:

给定以下 pandas DataFrame,其中一些索引为 NaN,由于它们的索引为 NaN,如何删除第三行和第八行?谢谢

import pandas as pd
import numpy  as np

data    = list('abcdefghil')
indices = [0, 1, np.nan, 3, 4, 5, 6, np.nan, 8, 9]

df = pd.DataFrame(data, index=indices, columns=['data'])

【问题讨论】:

    标签: python pandas numpy


    【解决方案1】:

    您可以在索引上调用dropna

    In[68]:
    df.loc[df.index.dropna()]
    
    Out[68]: 
        data
    0.0    a
    1.0    b
    3.0    d
    4.0    e
    5.0    f
    6.0    g
    8.0    i
    9.0    l
    

    注意NaN 的存在使得索引dtypefloat,将其更改为int 转换类型:

    In[70]:
    df = df.loc[df.index.dropna()]
    df.index = df.index.astype(int)
    df
    
    Out[70]: 
      data
    0    a
    1    b
    3    d
    4    e
    5    f
    6    g
    8    i
    9    l
    

    您也可以在索引上调用notnull 也可以(不知何故未记录)

    In[71]:
    df = df.loc[df.index.notnull()]
    df.index = df.index.astype(int)
    df
    
    Out[71]: 
      data
    0    a
    1    b
    3    d
    4    e
    5    f
    6    g
    8    i
    9    l
    

    还有isna:

    In[78]:
    df.loc[~df.index.isna()]
    
    Out[78]: 
        data
    0.0    a
    1.0    b
    3.0    d
    4.0    e
    5.0    f
    6.0    g
    8.0    i
    9.0    l
    

    还有更易读的逆notna

    In[79]:
    df.loc[df.index.notna()]
    
    Out[79]: 
        data
    0.0    a
    1.0    b
    3.0    d
    4.0    e
    5.0    f
    6.0    g
    8.0    i
    9.0    l
    

    正如@jpp 所评论的,您也可以使用*notnull

    In[80]:
    df.loc[pd.notnull(df.index)]
    
    Out[80]: 
        data
    0.0    a
    1.0    b
    3.0    d
    4.0    e
    5.0    f
    6.0    g
    8.0    i
    9.0    l
    

    还有*的isnanotna,和isnull,但是我不会展示这些,你可以查看docs

    【讨论】:

    • Index.dropna / Index.notnull 需要 Pandas >= 0.20.0,我相信(这就是我无法让它工作的原因)。但否则pd.notnull(df.index) 应该可以工作。
    • @jpp true 但我认为pandas 版本足够新
    • @jpp 你卡在<0.20.0了吗?
    • 是的,0.19,我无法控制的原因!
    【解决方案2】:

    您可以使用以下内容:

     df = df[df.index.isnull() == False]
    

    您可能希望在之后重置索引

    【讨论】:

      【解决方案3】:

      使用np.isnan 并取负:

      res = df[~np.isnan(df.index)]
      
      print(res)
      
          data
      0.0    a
      1.0    b
      3.0    d
      4.0    e
      5.0    f
      6.0    g
      8.0    i
      9.0    l
      

      【讨论】:

        最近更新 更多