在第一个NaN之后删除DataFrame行

时间:2017-08-03 16:24:33

标签: python pandas dataframe

我遇到了一个问题,我只能找到解决相反问题的方法。我需要能够删除特定列中第一个NaN值后面的DataFrame中的所有行。我找不到类似于pandas函数first_valid_index的函数,但反之亦然。

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

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列中找到第一个NaN后,DataFrame会被切片为仅包含在其上方。

非常感谢!

2 个答案:

答案 0 :(得分: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

答案 1 :(得分: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]