2016-11-02 16 views
3

Ich habe eine einfache Datenrahmen wie:Spalte Umnummerierung Pandas Dataframe

>>> df_test = pd.DataFrame(columns=["ID" ]) 
>>> df_test["DATE"] = [ '2001-02-01', '2001-03-01', '2001-02-15', '2001-03-15', '2001-02-15', '2001-03-30'] 
>>> df_test['ID'] = [1,2,3,1,5,4] 
>>> df_test 
    ID  DATE 
0 1 2001-02-01 
1 2 2001-03-01 
2 3 2001-02-15 
3 1 2001-03-15 
4 5 2001-02-15 
5 4 2001-03-30 

Ich möchte die ID-Spalten wie folgt neu zu ordnen:

>>> df_test 
    ID  DATE 
0 1 2001-02-01 
1 1 2001-03-01 
2 1 2001-02-15 
3 1 2001-03-15 
4 4 2001-02-15 
5 4 2001-03-30 

im Grunde jedes Mal dort eine ID kleiner als die vorherige ist man fülle die Präzedenzwerte mit der kleinen ID zurück, um Monotonie zu erhalten. Ich versuche, mit dem folgenden:

df_test.ID.lt(df_test.ID.shift()) 

, der mir den Änderungspunkt in Monotonie gibt:

0 False 
1 False 
2 False 
3  True 
4 False 
5  True 
Name: ID, dtype: bool 

Aber ich weiß nicht, wie sie vorwärts zu bewegen. Ich würde mich über jede Idee freuen

Vielen Dank!

+0

Können Sie die Logik dahinter klären, wo sich die ID ändern sollte? Warum wurde es bei Index = 4 von 1 auf 4 geändert? –

+1

Die ID identifiziert einen Fortschrittsstatus 1 (Beginn) bis 5 (Ende). Wenn der Prozess gut funktioniert, ist die Änderung idealerweise linear 1,2,3,4,5. Aber wenn der Status von 4 (fortlaufend) zurück zu 1 (wieder beginnen) geht, muss ich davon ausgehen, dass der Prozess immer in einem begin-Status war – user2320577

Antwort

0

Wie wäre es damit. Nicht sehr elegant, aber anscheinend funktioniert (Sie müssen dies auf einem echten Daten debuggen). Beachten Sie, dass die Schleife hier wichtig ist, da jede Iteration mit den aktuellen Daten arbeiten soll, nicht mit der ursprünglichen.

prev_max = 0 
for i in range(1, 6): 
    cur_max = df_test[df_test.ID == i].index.max() 
    if pd.notnull(cur_max): 
     df_test.loc[prev_max:cur_max, 'ID'] = i 
     prev_max = cur_max + 1 
+0

Danke, aber die letzte Zeile wirft einen Fehler wegen verschiedener Typen (multiindex vs int). Ich vielleicht damit behoben, aber sieht ein bisschen schmutzig aus: df.index [np.where (df.index.levels [1] == cur_max [1]) [0] [0] +1] – user2320577

+0

@ user2320577 aber Ihr Datenrahmen doesn Es scheint keinen Multiindex zu enthalten. Ist es in der Frage richtig definiert? –

+0

du hast Recht, mein Schlechter. Ich habe deine Lösung für einen Multiindex-DF benutzt und musste ihn ein wenig anpassen. Vielen Dank – user2320577