2017-08-03 152 views
1

我有一个问题,我只能找到相反问题的解决方案。我需要能够删除特定列中第一个NaN值后面的DataFrame中的所有行。我无法找到类似于熊猫功能first_valid_index的功能,但相反。删除第一个NaN后的DataFrame行

我所拥有的是类似的东西;

data = {'state': ['Ohio', 'Ohio', 'Ohio', 'NaN', 'Nevada'], 
     'year': [2000, 2001, 2002, 2001, 2002], 
     'pop': [1.5, 1.7, 3.6, 2.4, 2.9]} 
frame = pd.DataFrame(data) 

我想在最后看到的是这个;

data = {'state': ['Ohio', 'Ohio', 'Ohio'], 
     'year': [2000, 2001, 2002], 
     'pop': [1.5, 1.7, 3.6]} 
frame = pd.DataFrame(data) 

所以之后的第一楠的state列中找到,数据帧被切成仅包括它上面。

非常感谢!

回答

1

假设 '的NaN' 表示示例数据集实际NaN

In [341]: new = frame.loc[:frame.state.isnull().idxmax()-1] 

In [342]: new 
Out[342]: 
    pop state year 
0 1.5 Ohio 2000 
1 1.7 Ohio 2001 
2 3.6 Ohio 2002 

说明idxmax() - 返回第一最大值的索引。

演示:

In [345]: frame.loc[1,'state'] = np.nan 

In [346]: frame 
Out[346]: 
    pop state year 
0 1.5 Ohio 2000 
1 1.7  NaN 2001 
2 3.6 Ohio 2002 
3 2.4  NaN 2001 
4 2.9 Nevada 2002 

In [347]: frame.loc[:frame.state.isnull().idxmax()-1] 
Out[347]: 
    pop state year 
0 1.5 Ohio 2000 

In [348]: frame.state.isnull().idxmax() 
Out[348]: 1 
+0

这不应该是'idxmin'吗? –

+0

显然,这里的'NaN'是字符串。 – Zero

+0

@WillemVanOnsem,no,'idxmin()' - 将返回一个索引__first__非空值 – MaxU

1

如果NaN是第一个元素的系列或如果在该系列没有NaN值低于该解决方案将工作。

对于NaN,我允许使用空值或任何以NaN开头的字符串。

它找到第一个NaN值的索引位置(如果没有NaN值,则为None),然后索引数据帧。

idx = (frame['state'].isnull() | frame['state'].str.startswith('NaN')) 
idx = idx.idxmax() if idx.any() else None 
frame[:idx]  
+0

++用于解决NaN不存在的情况 – MaxU