熊猫:删除具有nan值索引的行

时间:2018-06-20 09:08:41

标签: python pandas numpy

给出以下一些索引为NaN的pandas DataFrame,既然索引为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'])

3 个答案:

答案 0 :(得分:5)

您可以在索引上呼叫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的存在使索引dtype float(将其更改为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

也有顶级isnanotnaisnull,但我将不显示它们,您可以检查docs

答案 1 :(得分:2)

您可以使用以下内容:

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

您可能要在之后重置索引

答案 2 :(得分:1)

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