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

Ali*_*n S 20 python dataframe pandas

我正在使用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
Run Code Online (Sandbox Code Playgroud)

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

df.drop(df.index[0:1])
Run Code Online (Sandbox Code Playgroud)

我收到此错误:

AttributeError: 'DataFrame' object has no attribute 'special_name'
Run Code Online (Sandbox Code Playgroud)

tim*_*els 27

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


Tom*_*ger 17

我发现最简单的方法是重置索引,删除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
Run Code Online (Sandbox Code Playgroud)

  • `df.loc [df.index.dropna()]`适用于最新版本. (6认同)
  • 这将删除任何行中具有空值的行,而不仅仅是索引。我建议改用@timdiels 的答案。 (2认同)

Joa*_*kim 5

没有一个答案对我来说 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
Run Code Online (Sandbox Code Playgroud)


Pie*_*ton 5

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

df[df.index.notnull()]
Run Code Online (Sandbox Code Playgroud)

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