2017-08-03 9 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) 

最初のNaNがstate列で見つかった後ので、データフレームのみがその上に含めるにスライスします。

多くの感謝! 'NaNの' あなたのサンプルデータセット内NaN本当表していると仮定すると、

答えて

1

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__のインデックスを返しませんnull値 – MaxU

1

NaNが直列または直列にはNaN値がない場合、最初の要素である場合は、以下の溶液が動作します。

NaNについては、null値または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

関連する問題