33

我正在使用 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'
4

6 回答 6

44

使用 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]

于 2015-11-26T12:47:13.543 回答
19

我发现最简单的方法是重置索引,删除 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
于 2013-10-29T23:57:13.617 回答
4

没有一个答案对我来说是 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
于 2016-10-21T16:14:07.923 回答
4

pandas0.19 开始,Indexes 确实有一个.notnull()方法,因此timdiels的答案可以简化为:

df[df.index.notnull()]

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

于 2017-03-30T13:34:57.470 回答
2

编辑:以下可能仅适用于MultiIndexs,并且在任何情况下都被新df.index.isnull()功能淘汰(请参阅其他答案)。我将仅出于历史兴趣而保留此答案。

对于现在遇到这种情况的人,可以直接执行此操作,而无需依赖索引中的 NaN 将用 label 表示这一事实来重新索引-1。所以:

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

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

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

注意:将索引级别称为“索引”有点误导:它通常是更具体的用途,例如“日期”或“实验运行”。

于 2015-07-31T08:40:51.583 回答
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 现在位于以索引的原始名称命名的列中(上例中的“索引”,因为没有指定名称)——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

于 2016-08-12T09:55:13.817 回答