2016-04-25 8 views
1

私は以下のようなデータフレームを持っています。行を比較し、必要に応じて行を取り出します

df = pd.DataFrame({ 'Area' : ['1', '2', '3', '4','5', '6', '7', '8', '9', '10'], 
        'Distance' : ['19626207', '20174412', '20175112', '19396352', 
        '19391124', '19851396', '19221462', '20195112', '21127633', '19989793'], 
        }) 

    Area Distance 
0 1 19626207 
1 2 20174412 
2 3 20175112 
3 4 19396352 # smaller, take out 
4 5 19391124 # 
5 6 19851396 # 
6 7 19221462 # 
7 8 20195112 
8 9 21127633 
9 10 19989793 # 

「距離」列は昇順で並べる必要があります。

しかし、データフレームの順序は固定です(「・エリア」の注文がchangableではありません)、意味

、行は前の行よりも小さい場合、 行を取り出すことが必要です。たとえば、私が見たいと思っている結果がここにあります。私はfor i in range(0, len(index), 1)ような何かを試すことができます知っている

Area Distance 
    1 19626207 
    2 20174412 
    3 20175112 
    8 20195112 
    9 21127633 

...

しかしにはパンダを使用して目標を達成するためesaier方法はありますか?

お願いします。

答えて

3

アップデート2:ここは動作しますayhanのソリューションです適切

In [135]: df[df.Distance.astype("int64")>=df.Distance.astype("int64").cummax()] 
Out[135]: 
    Area Distance 
0 1 19626207 
1 2 20174412 
2 3 20174412 
7 8 20195112 
8 9 21127633 

UPDATE:それはするので

次のソリューションは、常に、正常に動作しないますALL重複を削除してください。したがって、元のDFに値を重複させると、それらは消滅します。ここで

は例です:私は実用的なソリューションに

OLD答えを見つけるためにしようとするでしょう

In [122]: df 
Out[122]: 
    Area Distance 
0 1 19626207 
1 2 20174412 # duplicates 
2 3 20174412 # they should BOTH be in the result set 
3 4 19396352 
4 5 19391124 
5 6 19851396 
6 7 19221462 
7 8 20195112 
8 9 21127633 
9 10 19989793 

In [123]: df.loc[df.Distance.cummax().drop_duplicates().index] 
Out[123]: 
    Area Distance 
0 1 19626207 
1 2 20174412 # one duplicate has been dropped 
7 8 20195112 
8 9 21127633 

PS:

を私はそれが最も効率的な方法だかどうかわからないんだけどしかし、それは動作します:

In [94]: df.loc[df.Distance.cummax().drop_duplicates().index] 
Out[94]: 
    Area Distance 
0 1 19626207 
1 2 20174412 
2 3 20175112 
7 8 20195112 
8 9 21127633 

Explanatイオン:

+2

現在の行がcummaxよりも大きいかどうかを確認できます。 'dfDistance.astype(" int64 ")> = df.Distance.astype(" int64 ")。cummax()]' – ayhan

+0

@ayhan、それです!回答として投稿してください - それはあなたの解決策であり、それは私より優れています。 – MaxU

+0

私はキーアイデアは「cummax」だと思っています。あなたが思いついたのは重複したものなので、回答を編集する方が良いと思います。 :) – ayhan

関連する問題