Как классифицировать фрейм данных в конкретном случае?

#python #pandas #dataframe #sorting #classification

#питон #панды #фрейм данных #сортировка #классификация

Вопрос:

У меня есть pandas.DataFrame форма. Я покажу вам простой пример.(На самом деле он состоит из сотен миллионов строк данных.). Я хочу изменить число по мере изменения буквы в столбце «2». Числа в оставшихся столбцах (столбцы:1,3 ~) не должны изменяться.

 df=   index 1 2 3     0 0 a100 1  1 1.04 a100 2  2 32 a100 3  3 5.05 a105 4  4 1.01 a105 5  5 155 a105 6  6 3155.26 a105 7  7 354.12 a100 8  8 5680.13 a100 9  9 125.55 a100 10  10 13.32 a100 11  11 5656.33 a156 12  12 456.61 a156 13  13 23.52 a1235 14  14 35.35 a1235 15  15 350.20 a100 16  16 30. a100 17  17 13.50 a100 18  18 323.13 a231 19  19 15.11 a1111 20  20 11.22 a1111 21  

Вот мой ожидаемый результат:

 df=   index 1 2 3     0 0 0 1  1 1.04 0 2  2 32 0 3  3 5.05 1 4  4 1.01 1 5  5 155 1 6  6 3155.26 1 7  7 354.12 2 8  8 5680.13 2 9  9 125.55 2 10  10 13.32 2 11  11 5656.33 3 12  12 456.61 3 13  13 23.52 4 14  14 35.35 4 15  15 350.20 5 16  16 30 5 17  17 13.50 5 18  18 323.13 6 19  19 15.11 7 20  20 11.22 7 21  

Как мне решить эту проблему?

Ответ №1:

Используйте последовательные группы, созданные методом сравнения, для неравных сдвинутых значений с суммой, а затем вычитайте 1:

 #if column is string '2' df['2'] = df['2'].ne(df['2'].shift()).cumsum().sub(1)  #if column is number 2 df[2] = df[2].ne(df[2].shift()).cumsum().sub(1)  

 print (df)  index 1 2 3 0 0 0.00 0 1 1 1 1.04 0 2 2 2 32.00 0 3 3 3 5.05 1 4 4 4 1.01 1 5 5 5 155.00 1 6 6 6 3155.26 1 7 7 7 354.12 2 8 8 8 5680.13 2 9 9 9 125.55 2 10 10 10 13.32 2 11 11 11 5656.33 3 12 12 12 456.61 3 13 13 13 23.52 4 14 14 14 35.35 4 15 15 15 350.20 5 16 16 16 30.00 5 17 17 17 13.50 5 18 18 18 323.13 6 19 19 19 15.11 7 20 20 20 11.22 7 21  

Комментарии:

1. В примере вывода OP строки 7-10 отличаются от строк 0-2… — это похоже на рецепт последовательных групп, который, как я знаю, вы знаете и, вероятно, можете найти 🙂

2. Большое спасибо. Я решил эту проблему. Хорошего дня

3. @JonClements — ищу обманщика.