我遇到了一个问题,我只能找到解决相反问题的方法。我需要能够删除特定列中第一个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会被切片为仅包含在其上方。
非常感谢!
答案 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]