试图在数据帧中删除NaN索引行

问题描述 投票:17回答:6

我正在使用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
6个回答
15
投票

我发现最简单的方法是重置索引,删除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

25
投票

使用pandas version> = 0.20.0,您可以:

df[df.index.notnull()]

使用旧版本:

df[pandas.notnull(df.index)]

要打破它:

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


2
投票

测试这个工作:

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()命令自动执行此操作。
  • 来自最里面括号的第2行:df[df['index'].isnull()]使用isnull()命令筛选名为“index”的列显示“NaN”值的行。 .index用于将指向所有'index'= NaN行的明确索引对象传递到表达式最外部的df.drop(

nb:测试上面的命令以处理列中的多个NaN值

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


1
投票

这些答案对我来说都不是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

1
投票

pandas 0.19开始,Indexes确实有.notnull()方法,所以timdiels的答案可以简化为:

df[df.index.notnull()]

我认为(目前)是最简单的。


1
投票

编辑:以下可能仅适用于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)

注意:索引级别被称为“索引”有点误导:它通常是更具特定用途的东西,如'date'或'experimental_run'。

© www.soinside.com 2019 - 2024. All rights reserved.