Группа Python pandas проверяет, изменилось ли значение, а затем предыдущее значение

У меня проблема с функцией groupby библиотеки pandas. У меня есть следующий фрейм данных.

d = {'id': [400001, 400001, 400001, 400002, 400003, 400003, 400004, 400004], 'result': ['P','N','N','N','N','N','N','P'], 'date':['27/10/2021','09/09/2021','03/07/2020','03/07/2020','30/06/2020','27/04/2022','27/04/2022','30/06/2020']}
df = pd.DataFrame(data=d)
df
я бырезультатдата
400001Н2020-07-03
400001Н2021-09-09
400001п2021-10-27
400002Н2020-07-03
400003Н2020-06-30
400003Н2022-04-27
400004п2020-06-30
400004Н2022-04-27

Мне нужно сгруппировать по столбцу «id» и извлечь значение столбца «дата», где значение столбца «результат» изменяется. Если значение в столбце «результат» не меняется, сохраните первое значение столбца «дата».

Это пример:

я быдата
4000012021-10-27
4000022020-07-03
4000032020-06-30
4000042022-04-27

Я пробовал это:

df['change'] = np.where(df.groupby('id').esito.apply(lambda x:x!=x.iloc[0]),'Y','N')

но функция работает не так хорошо. Функция проверяет разницу с первым элементом столбца 'id' выбора groupby. Мне это не нужно.

Можете вы помочь мне? Спасибо

Может ли значение меняться много раз для каждого идентификатора? Что должно произойти?

mozway 16.05.2022 21:23

Да, это возможно. Вам нужно сохранить самое последнее значение

Macca 16.05.2022 21:27

Можете ли вы дважды проверить предоставленный DataFrame? Не соответствует таблице.

mozway 16.05.2022 21:56

Да, ты прав. Распечатанная таблица правильная.

Macca 16.05.2022 22:06
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения постов в Twitter с помощью Python, Tweepy и Flair
Анализ настроения текстовых сообщений может быть настолько сложным или простым, насколько вы его сделаете. Как и в любом ML-проекте, вы можете выбрать...
7 лайфхаков для начинающих Python-программистов
7 лайфхаков для начинающих Python-программистов
В этой статье мы расскажем о хитростях и советах по Python, которые должны быть известны разработчику Python.
Установка Apache Cassandra на Mac OS
Установка Apache Cassandra на Mac OS
Это краткое руководство по установке Apache Cassandra.
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
Сертификатная программа "Кванты Python": Бэктестер ансамблевых методов на основе ООП
В одном из недавних постов я рассказал о том, как я использую навыки количественных исследований, которые я совершенствую в рамках программы TPQ...
Создание персонального файлового хранилища
Создание персонального файлового хранилища
Вы когда-нибудь хотели поделиться с кем-то файлом, но он содержал конфиденциальную информацию? Многие думают, что электронная почта безопасна, но это...
Создание приборной панели для анализа данных на GCP - часть I
Создание приборной панели для анализа данных на GCP - часть I
Недавно я столкнулся с интересной бизнес-задачей - визуализацией сбоев в цепочке поставок лекарств, которую могут просматривать врачи и...
1
4
28
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Вы можете использовать дубликаты дважды, чтобы получить то, что хотите:

import pandas as pd

d = {'id': [400001, 400001, 400001, 400002, 400003, 400003, 400004, 400004],
     'result': ['N', 'N', 'P', 'N', 'N', 'N', 'P', 'N'],
     'date': ['27/10/2021', '09/09/2021', '03/07/2020', '03/07/2020', '30/06/2020', '27/04/2022', '27/04/2022',
              '30/06/2020']}
df = pd.DataFrame(data=d)

df.drop_duplicates(subset=['id', 'result'], keep='first', inplace=True)
df.drop_duplicates(subset=['id'], keep='last', inplace=True)

print(df)

Выход:

       id result        date
2  400001      P  03/07/2020
3  400002      N  03/07/2020
4  400003      N  30/06/2020
7  400004      N  30/06/2020

Обратите внимание, что вывод в вашем вопросе может быть неправильным в зависимости от ваших требований.

Ответ принят как подходящий

Вы можете вычислить cumsum логических значений, идентифицирующих изменения. Затем получите максимальный индекс:

idx = (df.groupby('id')['result']
         .apply(lambda s: s.ne(s.shift())
                .cumsum()
                .idxmax()
               )
       )
df.loc[idx]

Выход:

       id result        date
1  400001      N  09/09/2021
3  400002      N  03/07/2020
4  400003      N  30/06/2020
7  400004      P  30/06/2020

NB. Ввод, предоставленный как DataFrame, отличается от ввода в виде таблицы. Здесь показан вывод, соответствующий DataFrame.

При необходимости сначала отсортируйте даты:

idx = (df.sort_values(by=['id', 'date'])
         .groupby('id')['result']
         .apply(lambda s: s.ne(s.shift())
                .cumsum()
                .idxmax()
               )
       )
df.loc[idx]

Выход:

       id result        date
0  400001      P  27/10/2021
3  400002      N  03/07/2020
5  400003      N  27/04/2022
7  400004      P  30/06/2020

Хорошо спасибо. Но в случае «id» = 400003, когда значение столбца «результат» не меняется, мы должны сохранить первое значение «дата». Я не знаю, ясно ли я выразился.

Macca 16.05.2022 22:11

Да, и это первая строка в предоставленном DataFrame

mozway 16.05.2022 22:14

Тот самый: d = {'id': [400001, 400001, 400001, 400002, 400003, 400003, 400004, 400004], 'result': ['P','N','N','N','N','N','N','P'], 'date':['27/10/2021','09/09/2021','03/07/2020','03/07/2020',‌​'30/06/2020','27/04/‌​2022','27/04/2022','‌​30/06/2020']} ; df = pd.DataFrame(data=d)

mozway 16.05.2022 22:15

хорошо, с первым значением я имею в виду менее поздние. Так что сортировать значения правильно.

Macca 16.05.2022 22:23

Другие вопросы по теме