2016-11-02 182 views
3

我有一個簡單數據幀,如:列重編熊貓數據幀

>>> 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 

我想重新排序ID列如下:

>>> 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 

基本上每個有一個ID比以前更小的時間用小ID填寫先例值以保持單調。 我想有以下幾點:

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

,讓我在單調的變化點:

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

但我不知道如何前進。 我將不勝感激

謝謝!

+0

你能澄清一下ID應該改變的邏輯嗎?爲什麼索引= 4時從1變爲4? –

+1

該ID標識進度狀態1(開始)至5(結束)。如果這個過程正常工作,那麼理想的變化是1,2,3,4,5。但是當狀態從4(正在進行)返回到1(再次開始)時,我需要假定進程始終處於開始狀態 – user2320577

回答

0

這個怎麼樣。不是很優雅,但顯然工作(你需要在真實數據上進行調試)。請注意,循環在這裏很重要,因爲每次迭代都應該對當前數據進行操作,而不是對當前數據進行操作。

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

謝謝,但最後一行由於不同類型(多索引與整數)而引發錯誤。我可能修好了,但看起來有點髒:df.index [np.where(df.index.levels [1] == cur_max [1])[0] [0] +1] – user2320577

+0

@ user2320577但你的數據幀doesn似乎不包含多指標。它在問題中是否正確定義? –

+0

你是對的,我的壞。我在多指標DF上使用了你的解決方案,我不得不適應它。謝謝 – user2320577