Подсчитайте количество изменений значений в столбце Pandas

у меня вот такая дф

name    class    date     value
Andy     A      20220101    0 
Andy     A      20220103    1
Andy     A      20220104    0 
Bob      Z      20221120    0 
Bob      Z      20221121    0
Bob      Z      20221125    0
Bob      Z      20221127    1

Столбец value принимает значение только 0 или 1. Для каждой группы (определяемой двумя столбцами name и class) столбец date является порядком в порядке возрастания. Я пытаюсь рассчитать для каждой группы соотношение: количество раз, когда значение столбца value изменяется (0 -> 1 или 1 -> 0), деленное на количество дат с данными.

Для приведенного выше кадра данных группа (Энди, А) меняется 2 раза за 3 дня, поэтому соотношение составляет 2/3. Группа (Боб, Z) меняется 1 раз за 4 дня, поэтому соотношение 1/4=0,25.

Интересно, есть ли способ сделать это эффективно в Pandas?

что ты уже испробовал?

BeRT2me 17.05.2022 04:36

можете ли вы поделиться кодом для построения ваших данных?

Death Metal 17.05.2022 05:20
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
Четыре эффективных способа центрирования блочных элементов в CSS
Четыре эффективных способа центрирования блочных элементов в CSS
У каждого из нас бывали случаи, когда нам нужно отцентрировать блочный элемент, но мы не знаем, как это сделать. Даже если мы реализуем какой-то...
1
2
29
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Это работает

# mark the changes in value
df['changes'] = df['value'].diff().ne(0).cumsum()
# count the number of changes and the number of values for each name
aggregated = df.groupby('name').agg({'changes':'nunique', 'value':'size'})
# by construction, we counted the original, so to count the "changes", we must subtract 1
aggregated['changes'] -= 1
# find the ratio
final = aggregated['changes'] / aggregated['value']
name
Andy    0.666667
Bob     0.250000
dtype: float64
Ответ принят как подходящий

Ты можешь попробовать

out = (df
       .groupby(['name', 'class']).apply(lambda g: g['value'].shift().bfill().ne(g['value']).sum()/g['date'].nunique())
       .round(2)
       .to_frame('ratio')
       .reset_index())

print(out)

   name class  ratio
0  Andy     A   0.67
1   Bob     Z   0.25

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