【问题标题】:Trying to drop NaN indexed row in dataframe试图在数据框中删除 NaN 索引行
【发布时间】:2021-06-03 23:03:37
【问题描述】:

我使用的是 python 2.7.3 和 Pandas 版本 0.12.0。

我想删除带有 NaN 索引的行,以便我只有有效的 site_id 值。

print df.head()
            special_name
site_id
NaN          Banana
OMG          Apple

df.drop(df.index[0])

TypeError: 'NoneType' object is not iterable

如果我尝试删除一个范围,如下所示:

df.drop(df.index[0:1])

我收到此错误:

AttributeError: 'DataFrame' object has no attribute 'special_name'

【问题讨论】:

    标签: python pandas dataframe


    【解决方案1】:

    使用 pandas 版本 >= 0.20.0,您可以:

    df = df[df.index.notnull()]
    

    旧版本:

    df = df[pandas.notnull(df.index)]
    

    分解:

    notnull 生成一个布尔掩码,例如[False, False, True],其中 True 表示对应位置的值为空(numpy.nanNone)。然后,我们使用df[boolean_mask] 选择其索引对应于掩码中的真值的行。

    【讨论】:

    • 不应该是notnull()而不是isnull()吗?
    • df[df.index.notnull()]
    • 感谢 Pietro Battiston 和 Zero 提供最新的最佳答案。
    • 这确实是最简洁最简洁的答案。我只是补充一点,需要将它分配回原始 df 或另一个数据帧,才能真正考虑从数据帧中删除空索引。
    【解决方案2】:

    我发现最简单的方法是重置索引,删除 NaN,然后​​再次重置索引。

    In [26]: dfA.reset_index()
    Out[26]: 
      index special_name
    0   NaN        Apple
    1   OMG       Banana
    
    In [30]: df = dfA.reset_index().dropna().set_index('index')
    
    In [31]: df
    Out[31]: 
          special_name
    index             
    OMG         Banana
    

    【讨论】:

    • df.loc[df.index.dropna()] 适用于最新版本。
    • 这将删除任何行中具有空值的行,而不仅仅是索引。我建议改用@timdiels 的答案。
    【解决方案3】:

    没有一个答案对我来说是 100% 有效的。这是有效的:

    In [26]: print df
    Out[26]:            
              site_id      special_name
    0         OMG          Apple
    1         NaN          Banana
    2         RLY          Orange
    
    
    In [27]: df.dropna(inplace=True)
    Out[27]:            
              site_id      special_name
    0         OMG          Apple
    2         RLY          Orange
    
    In [28]: df.reset_index(inplace=True)
    Out[28]:            
              index     site_id      special_name
    0         0         OMG          Apple
    1         2         RLY          Orange
    
    In [29]: df.drop('index', axis='columns', inplace=True)
    Out[29]:             
              site_id      special_name
    0         OMG          Apple
    1         RLY          Orange
    

    【讨论】:

      【解决方案4】:

      截至pandas 0.19,Indexes 确实有一个.notnull() 方法,因此timdiels 的答案可以简化为:

      df[df.index.notnull()]
      

      我认为这是(目前)你能得到的最简单的。

      【讨论】:

        【解决方案5】:

        测试它是否有效:

        df.reset_index(inplace=True)

        df.drop(df[df['index'].isnull()].index, inplace=True)


        我如何检查上述内容

        使用复制原始问题中的表格 df=pd.DataFrame(data=['Banana', 'Apple'], index=[np.nan, 'OMG'],columns=['Special_name'])

        然后输入上面的两行代码——我在下面尝试用人类语言解释:

        • 第一行将索引重置为整数,NaN 现在位于以索引的原始名称命名的列中(上例中的“index”,因为没有指定名称)——pandas 使用 reset_index 自动执行此操作() 命令。
        • 从最里面的括号开始的第二行:df[df['index'].isnull()] 使用 isnull() 命令过滤名为“index”的列显示“NaN”值的行。 .index 用于将指向所有 'index'=NaN 行的明确索引对象传递给表达式最外层的df.drop(

        nb:测试了上面的命令对列中的多个 NaN 值起作用

        使用 Python 3.5.1,Pandas 0.17.1 通过 Anaconda 包 32bits

        【讨论】:

          【解决方案6】:

          编辑:以下内容可能仅适用于MultiIndexs,并且在任何情况下都被新的df.index.isnull() 函数废弃(参见其他答案)。我将仅出于历史兴趣而保留此答案。

          对于现在遇到此问题的人,可以直接执行此操作而无需重新索引,因为索引中的 NaN 将用标签 -1 表示这一事实。所以:

          df = dfA[dfA.index.labels!=-1]
          

          更好的是,在 Pandas>0.16.1 中,可以使用 drop() 就地执行此操作而无需复制:

          dfA.drop(labels=[-1], level='index', inplace=True)
          

          注意:将索引级别称为“索引”有点误导:它通常是更特定于使用的东西,例如“日期”或“实验运行”..

          【讨论】:

          • 在 pandas 0.17.0 中不起作用。 Index 没有labels 属性,建议的丢弃导致AssertionError: axis must be a MultiIndex
          • 如果我的索引同时具有NaN 值和-1 值怎么办?
          • @LaurensKoppenol 上面的代码引用了索引的labels,而不是直接引用索引:索引中的NaN值由labels中的-1表示。我不相信labels 属性可以包含NaN
          • @timdiels 感谢您的评论 - 如果没有 MultiIndex,这很可能是行不通的。无论如何,我认为这是一个过时的答案,因为 pandas 有一个 df.index.notnull() 函数。我会让它代表历史利益。
          猜你喜欢
          • 2017-11-12
          • 1970-01-01
          • 1970-01-01
          • 2016-06-01
          • 2018-01-02
          • 1970-01-01
          • 1970-01-01
          • 2013-05-12
          • 2019-05-15
          相关资源
          最近更新 更多