2016-04-25 27 views
1

Ich habe einen Beispieldatenrahmen wie folgt.Vergleichen Sie Zeilen und dann Zeilen, wenn nötig.

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 # 

Die Spalte 'Abstand' muss in aufsteigender Reihenfolge angeordnet werden.

Aber die Reihenfolge der Datenrahmen festgelegt ist (Order of ‚Area‘ ist nicht veränderbare),

was bedeutet, wenn Reihen kleiner als vorherige Zeilen, dann die Zeilen werden müssen genommen. Zum Beispiel, hier ist das Ergebnis, das ich gerne sehen würde.

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

Ich weiß, dass ich so etwas wie for i in range(0, len(index), 1) versuchen ...

Aber gibt es esaier Weg, um das Ziel mit Pandas zu erreichen?

Irgendwelche Hinweise bitte?

Antwort

3

UPDATE2: hier ist ayhan ‚s-Lösung, die richtig funktioniert:

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:

die folgende Lösung wird NICHT immer wird es richtig, weil Arbeit Entfernen Sie ALLE Duplikate. Wenn du also Werte in deinem ursprünglichen DF dupliziert hast, werden sie verschwinden. Hier

ein Beispiel:

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 Ich werde versuchen, eine funktionierende Lösung

OLD Antwort zu finden:

Ich bin nicht sicher, ob es die effizienteste Methode ist , aber es funktioniert:

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 

Erläuterung ion:

In [98]: df.Distance.cummax() 
Out[98]: 
0 19626207 
1 20174412 
2 20175112 
3 20175112 
4 20175112 
5 20175112 
6 20175112 
7 20195112 
8 21127633 
9 21127633 
Name: Distance, dtype: object 
+2

Ich denke, dass Sie überprüfen können, ob die aktuelle Zeile größer als die Cummax ist. 'df [df.Distance.astype (" int64 ")> = df.Widerstand.astype (" int64 "). cummax()]' – ayhan

+0

@ayhan, das ist es !!! Bitte posten Sie es als Antwort - es ist Ihre Lösung und es ist besser als meine. – MaxU

+0

Ich denke, die Schlüsselidee war 'cummax' - die du erfunden hast, und die Duplikate waren ein kleines Detail, also denke ich, dass es besser wäre, wenn du deine Antwort redest. :) – ayhan

Verwandte Themen