2017-10-22 26 views
1

私は以下のようなデータフレームを持っています。 > = 1の連続した行があり、y_lに値が設定され、y_hにNaNが設定され、その逆もあります。 NaNの間に1つ以上の連続した入力行がある場合、最も低いy_lまたは最も高いy_hを持つものだけを保持したいだけです。例: 最後の3行から下のdfに2番目のものだけを残し、残りの2つは破棄します。 これを実装するにはどうすればよいでしょうか?pandasデータフレームの連続したデータ行をNaN行にフィルタリングするにはどうすればよいですか?

df = pd.DataFrame({'y_l': [NaN, 97,95,98,NaN],'y_h': [90, NaN,NaN,NaN,95]}, columns=['y_l','y_h']) 

>>> df 

    y_l y_h 
0 NaN 90.0 
1 97.0 NaN 
2 95.0 NaN 
3 98.0 NaN 
4 NaN 95 

望ましい結果:

 y_l y_h 
0 NaN 90.0 
1 95.0 NaN 
2 NaN 95 
+0

x_hとx_lを考慮する必要はありません。 – Wen

+1

「btw」とは何ですか?ようこそ。時間をかけて[ask]とそれに含まれるリンクを読んでください。 – wwii

+0

最後に質問してから何か試しましたか? – wwii

答えて

2

あなたは、列の変更命令のための最後に新しい列またはSeriesを作成するための各consecutivesを区別して、aggによってaggreagteでgroupbyを使用する必要があります使用reindex

a = df['y_l'].isnull() 
b = a.ne(a.shift()).cumsum() 
df = (df.groupby(b, as_index=False) 
     .agg({'y_l':'min', 'y_h':'max'}) 
     .reindex(columns=['y_l','y_h'])) 
print (df) 
    y_l y_h 
0 NaN 90.0 
1 95.0 NaN 
2 NaN 95.0 

詳細:

print (b) 
0 1 
1 2 
2 2 
3 2 
4 3 
Name: y_h, dtype: int32 
+0

素晴らしいソリューションありがとう! – Panos

1

もっと多くの列がある場合はどうなりますか?あなたは以下のように無関係な行をフィルタリングした後、カラムAの値を保つことができる方法の例

df = pd.DataFrame({'A': [NaN, 15,20,25,NaN],'y_l': [NaN, 97,95,98,NaN],'y_h': [90, NaN,NaN,NaN,95]}, columns=['A','y_l','y_h']) 
>>>df 

    A  y_l  y_h 
0 NaN  NaN  90.0 
1 15.0 97.0 NaN 
2 20.0 95.0 NaN 
3 25.0 98.0 NaN 
4 NaN  NaN  95.0 

ため ?

 A  y_l  y_h 
0 NaN  NaN  90.0 
1 20.0 95.0 NaN 
2 NaN  NaN  95.0 
関連する問題