2016-11-02 3 views
3

У меня есть простой dataframe как:Колонка перенумерации Панды 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 

Я хотел бы изменить порядок идентификаторов столбцов следующим образом:

>>> 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 меньше, чем предыдущая один заполняет предыдущие значения с помощью небольшого идентификатора, чтобы сохранить монотонность. Я пытаюсь со следующим:

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

Можете ли вы разъяснить логику того, где должен измениться идентификатор? Почему он изменился с 1 на 4 по индексу = 4? –

+1

Идентификатор идентифицирует статус прогресса 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

Спасибо, но последняя строка выдает ошибку из-за разных типов (multiindex vs int). Я, возможно, исправил это, но выглядит немного грязным: df.index [np.where (df.index.levels [1] == cur_max [1]) [0] [0] +1] – user2320577

+0

@ user2320577, но ваш dataframe doesn Кажется, что он содержит мультииндекс. Правильно ли он задан в вопросе? –

+0

ты прав, мой плохой. Я использовал ваше решение на мультииндексе DF, и мне пришлось немного его адаптировать. спасибо – user2320577

Смежные вопросы