С Новым годом! Форум программистов, компьютерный форум, киберфорум
Python
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.69/29: Рейтинг темы: голосов - 29, средняя оценка - 4.69
0 / 0 / 0
Регистрация: 08.11.2021
Сообщений: 6

Нумерация в DataFrame

08.11.2021, 11:51. Показов 6562. Ответов 2

Студворк — интернет-сервис помощи студентам
Добрый день. У меня есть следующий набор данных


 
idx FGNr Status Date Message
1 Auto1 Status 08.08.2020 anything
2 Auto1 Status 09.08.2020 anything
3 Auto1 Status 10.08.2020 anything
4 Auto1 Status 11.08.2020 anything
5 Auto1 Status 12.08.2020 anything
6 Auto1 Status 13.08.2020 anything
7 Auto1 Status 14.08.2020 Start
8 Auto1 Status 15.08.2020 anything
9 Auto1 Status 16.08.2020 anything
10 Auto1 Status 17.08.2020 anything
11 Auto1 Status 18.08.2020 anything
12 Auto1 Status 19.08.2020 anything
13 Auto1 Status 20.08.2020 anything
14 Auto1 Status 21.08.2020 anything
15 Auto1 Status 22.08.2020 anything
16 Auto1 Status 23.08.2020 End
17 Auto1 Status 24.08.2020 anything
18 Auto1 Status 25.08.2020 anything
19 Auto1 Status 26.08.2020 anything
20 Auto1 Status 27.08.2020 anything
21 Auto1 Status 28.08.2020 anything
22 Auto1 Status 29.08.2020 anything
23 Auto1 Status 30.08.2020 anything
24 Auto1 Status 31.08.2020 anything
25 Auto1 Status 01.09.2020 Start
26 Auto1 Status 02.09.2020 anything
27 Auto1 Status 03.09.2020 anything
28 Auto1 Status 04.09.2020 anything
29 Auto1 Status 05.09.2020 anything
30 Auto1 Status 06.09.2020 anything
31 Auto1 Status 07.09.2020 End
32 Auto1 Status 08.09.2020 anything

и функция, которая добавляет в него новый столбец с порядковым номером. Этот номер присваевается в зависимости от значения в столбце Message. Все блоки начинающиеся со Start и заканчивающиеся End должны быть пронумерованы по порядку. Это выполняет следующая функция:

Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
def tracker(df):
    df['Number'] = 0
    k = 0
    j = 1
    for i in range(0, len(df)):
        if df['Message'][i] == 'End':
            df['Number'][i] = 0
            j = k + 1
            k = 0
            
        if df['Message'][i] == 'Start':
            df['Number'][i] = k + j
            k = k + j
            
        df['Number'][i] = k   
    
    return df
tracker(df)
С этим набором данных функция выполняет ее задание правильно. Моя проблема заключается в том, что если значение Start в наборе данных встречается несколько раз перед тем, как встретится End, то нумерация сбивается. Вот пример набора данных, где Start встречается несколько раз:

 
idx FGNr Status Date Message
1 Auto1 Status 08.08.2020 anything
2 Auto1 Status 09.08.2020 anything
3 Auto1 Status 10.08.2020 anything
4 Auto1 Status 11.08.2020 Start
5 Auto1 Status 12.08.2020 anything
6 Auto1 Status 13.08.2020 anything
7 Auto1 Status 14.08.2020 Start
8 Auto1 Status 15.08.2020 anything
9 Auto1 Status 16.08.2020 anything
10 Auto1 Status 17.08.2020 Start
11 Auto1 Status 18.08.2020 anything
12 Auto1 Status 19.08.2020 anything
13 Auto1 Status 20.08.2020 anything
14 Auto1 Status 21.08.2020 anything
15 Auto1 Status 22.08.2020 anything
16 Auto1 Status 23.08.2020 End
17 Auto1 Status 24.08.2020 anything
18 Auto1 Status 25.08.2020 anything
19 Auto1 Status 26.08.2020 anything
20 Auto1 Status 27.08.2020 anything
21 Auto1 Status 28.08.2020 anything
22 Auto1 Status 29.08.2020 anything
23 Auto1 Status 30.08.2020 anything
24 Auto1 Status 31.08.2020 anything
25 Auto1 Status 01.09.2020 Start
26 Auto1 Status 02.09.2020 anything
27 Auto1 Status 03.09.2020 anything
28 Auto1 Status 04.09.2020 anything
29 Auto1 Status 05.09.2020 anything
30 Auto1 Status 06.09.2020 anything
31 Auto1 Status 07.09.2020 End
32 Auto1 Status 08.09.2020 anything

Как сделать так, чтобы все значения Start были проигнорированы кроме того, за которым следует End. В общем табличка должна выглядеть вот так, как на фото:

0
Лучшие ответы (1)
cpp_developer
Эксперт
20123 / 5690 / 1417
Регистрация: 09.04.2010
Сообщений: 22,546
Блог
08.11.2021, 11:51
Ответы с готовыми решениями:

Новый Dataframe с информацией из старого Dataframe
У меня есть такой Dataframe. Мне нужно посчитать количество каждого значения из столбца Message для каждого номера из...

Pandas. Изменение значений Dataframe исходя из другого Dataframe
Добрый день. Прошу подсказать с реализаций следующего алгоритма: я загружаю из файла примерно следующий Dataframe(db): ...

DataFrame
Как работает двоеточие в данном случае? (не то что оно делает, а с точки зрения языка) В офф документации только примеры использования,...

2
Эксперт Python
8848 / 4500 / 1864
Регистрация: 27.03.2020
Сообщений: 7,316
09.11.2021, 11:40
Лучший ответ Сообщение было отмечено TamaraTam как решение

Решение

TamaraTam,
Python
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import pandas as pd
import numpy as np
my_base = [['idx', 'FGNr', 'Status', 'Date', 'Message'], ['1', 'Auto1', 'Status', '08.08.2020', 'anything'], ['2', 'Auto1', 'Status', '09.08.2020', 'anything'], ['3', 'Auto1', 'Status', '10.08.2020', 'anything'], ['4', 'Auto1', 'Status', '11.08.2020', 'Start'], ['5', 'Auto1', 'Status', '12.08.2020', 'anything'], ['6', 'Auto1', 'Status', '13.08.2020', 'anything'], ['7', 'Auto1', 'Status', '14.08.2020', 'Start'], ['8', 'Auto1', 'Status', '15.08.2020', 'anything'], ['9', 'Auto1', 'Status', '16.08.2020', 'End'], ['10', 'Auto1', 'Status', '17.08.2020', 'Start'], ['11', 'Auto1', 'Status', '18.08.2020', 'anything'], ['12', 'Auto1', 'Status', '19.08.2020', 'anything'], ['13', 'Auto1', 'Status', '20.08.2020', 'anything'], ['14', 'Auto1', 'Status', '21.08.2020', 'anything'], ['15', 'Auto1', 'Status', '22.08.2020', 'anything'], ['16', 'Auto1', 'Status', '23.08.2020', 'End'], ['17', 'Auto1', 'Status', '24.08.2020', 'anything'], ['18', 'Auto1', 'Status', '25.08.2020', 'anything'], ['19', 'Auto1', 'Status', '26.08.2020', 'anything'], ['20', 'Auto1', 'Status', '27.08.2020', 'anything'], ['21', 'Auto1', 'Status', '28.08.2020', 'anything'], ['22', 'Auto1', 'Status', '29.08.2020', 'anything'], ['23', 'Auto1', 'Status', '30.08.2020', 'anything'], ['24', 'Auto1', 'Status', '31.08.2020', 'anything'], ['25', 'Auto1', 'Status', '01.09.2020', 'Start'], ['26', 'Auto1', 'Status', '02.09.2020', 'anything'], ['27', 'Auto1', 'Status', '03.09.2020', 'anything'], ['28', 'Auto1', 'Status', '04.09.2020', 'anything'], ['29', 'Auto1', 'Status', '05.09.2020', 'anything'], ['30', 'Auto1', 'Status', '06.09.2020', 'anything'], ['31', 'Auto1', 'Status', '07.09.2020', 'End'], ['32', 'Auto1', 'Status', '08.09.2020', 'anything']]
df = pd.DataFrame(my_base[1:], columns = my_base[0])
 
# выбираем строки только со "Start" и "End"
df1 = df[df['Message'].isin(['Start','End'])]
 
# выбираем строки с "End" либо "Start" при условии, что следующая "End"
df1 = df1[(df1.Message.values == 'End') | (df1.Message.shift(-1).values == 'End')]
 
# группировка по "Message" с добавлением столбца 
# с кумулятивной суммой количества значений
df1 = df1.groupby('Message').cumcount() + 1
 
# слияние df и df1
df = pd.concat([df, df1],  axis=1)
 
# переименование присоединенного столбца
df = df.rename(columns = {df.columns[-1] : 'Number'})
 
# если предыдущее значение в Message = "End" и текущее не "Start",
# то значение в Number = np.inf 
df.Number = np.where((df.Message.shift(1).isin(['End'])) & (~df.Message.isin(['Start'])), np.inf, df.Number)
 
# заполнение Nan'ов предыдущим не Nan значением
df.Number.ffill(inplace=True)
 
# Обратная замена np.inf на np.nan
df.Number.replace(np.inf, np.nan, inplace=True)
 
print(df)
На будущее - в pandas и numpy почти всегда можно обойтись без явных циклов (в этом их преимущество в скорости расчетов)...
1
0 / 0 / 0
Регистрация: 08.11.2021
Сообщений: 6
12.11.2021, 17:15  [ТС]
Спасибо вам огромное! Это очень интересное решение вопроса. Вот бы и мне научиться так думать)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
raxper
Эксперт
30234 / 6612 / 1498
Регистрация: 28.12.2010
Сообщений: 21,154
Блог
12.11.2021, 17:15
Помогаю со студенческими работами здесь

Работа в DataFrame
Есть колонка с буквами в ДатаФрейме. Надо буквы поменять на слова, пишу такой код, но дает ошибку def dom(arg): result = '' if...

Работа в DataFrame
У меня есть ДатаФрейм и один из столбов называется "От станции" Он содержит такие значения .......25т ...

Empty DataFrame
Пытаюсь найти confidence однако после запуска кода выдает то, что Empty DataFrame. Даже при Empty DataFrame. Ошибки не выбивает....

Создание dataframe
Добрый день! Недавно начал заниматься анализом данных и столкнулся с проблемой создания массива dataframe таблиц. Необходимо распилить...

Проблема с DataFrame
Такая проблема, целевая переменная у состоит из значений "no" и "yes", но мне необходимо заменить их на 0 и 1 соответсвенно. Банальная...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
3
Ответ Создать тему
Новые блоги и статьи
Расчёт переходных процессов в цепи постоянного тока
igorrr37 16.01.2026
/ * Дана цепь постоянного тока с R, L, C, k(ключ), U, E, J. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа, решает её и находит токи на L и напряжения на C в установ. режимах до и. . .
Восстановить юзерскрипты Greasemonkey из бэкапа браузера
damix 15.01.2026
Если восстановить из бэкапа профиль Firefox после переустановки винды, то список юзерскриптов в Greasemonkey будет пустым. Но восстановить их можно так. Для этого понадобится консольная утилита. . .
Изучаю kubernetes
lagorue 13.01.2026
А пригодятся-ли мне знания kubernetes в России?
Сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru