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

Нумерация в DataFrame

08.11.2021, 11:51. Показов 6631. Ответов 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
8851 / 4502 / 1864
Регистрация: 27.03.2020
Сообщений: 7,317
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
Ответ Создать тему
Новые блоги и статьи
SDL3 для Desktop (MinGW): Рисуем цветные прямоугольники с помощью рисовальщика SDL3 на Си и C++
8Observer8 17.03.2026
Содержание блога Финальные проекты на Си и на C++: finish-rectangles-sdl3-c. zip finish-rectangles-sdl3-cpp. zip
Символические и жёсткие ссылки в Linux.
algri14 15.03.2026
Существует два типа ссылок — символические и жёсткие. Ссылка в Linux — это запись в каталоге, которая может указывать либо на inode «файла-ИСТОЧНИКА», тогда это будет «жёсткая ссылка» (hard link),. . .
[Owen Logic] Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора
ФедосеевПавел 14.03.2026
Поддержание уровня воды в резервуаре количеством включённых насосов: моделирование и выбор регулятора ВВЕДЕНИЕ Выполняя задание на управление насосной группой заполнения резервуара,. . .
делаю науч статью по влиянию грибов на сукцессию
anaschu 13.03.2026
прикрепляю статью
SDL3 для Desktop (MinGW): Создаём пустое окно с нуля для 2D-графики на SDL3, Си и C++
8Observer8 10.03.2026
Содержание блога Финальные проекты на Си и на C++: hello-sdl3-c. zip hello-sdl3-cpp. zip Результат:
Установка CMake и MinGW 13.1 для сборки С и C++ приложений из консоли и из Qt Creator в EXE
8Observer8 10.03.2026
Содержание блога MinGW - это коллекция инструментов для сборки приложений в EXE. CMake - это система сборки приложений. Здесь описаны базовые шаги для старта программирования с помощью CMake и. . .
Как дизайн сайта влияет на конверсию: 7 решений, которые реально повышают заявки
Neotwalker 08.03.2026
Многие до сих пор воспринимают дизайн сайта как “красивую оболочку”. На практике всё иначе: дизайн напрямую влияет на то, оставит человек заявку или уйдёт через несколько секунд. Даже если у вас. . .
Модульная разработка через nuget packages
DevAlt 07.03.2026
Сложившийся в . Net-среде способ разработки чаще всего предполагает монорепозиторий в котором находятся все исходники. При создании нового решения, мы просто добавляем нужные проекты и имеем. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru