Подсчет подходящих минут с часами как группа -python

Я хочу найти количество подходящих минут, имея час в группе. Поскольку я работаю с большим набором данных, можно ли использовать агрегатную функцию pandas для получения этого вывода?

user minutes hour
1    778     12
1    779     12
1    780     13
1    781     13
1    782     13
1    783     13

Я пытался использовать df.groupby('hour').count(), но вывод неправильный.

user hour minutes
1    12   2
1    13   4

Правильный вывод, который я хочу, неверен, так как я хочу, чтобы 780-я минута также включалась в 12-й час.

user hour minutes
1    12   3
1    13   4

Ваша помощь очень ценится.

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
1
0
26
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

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

IIUC, вы можете использовать divmod, чтобы получить деление и остаток на 60 и добавить недостающие строки с помощью pandas.concat:

s1,s2 = df['minutes'].divmod(60)
(pd
 .concat([df,
          # select rows where hour is multiple of 60
          # and matching hour is not already the previous hour
                                          # decrement hour
          df[s1.ne(df['hour']-1)&s2.eq(0)].eval('hour = hour-1')
          ])
 .groupby('hour')
 .agg({'hour': 'first', 'minutes': 'count'})
)

Или, если вы уже знаете, что часы и минуты совпадают, упростите, используя только mod:

mask = df['minutes'].mod(60).eq(0)
(pd
 .concat([df,
          df[mask].eval('hour = hour-1')
          ])
 .groupby('hour')
 .agg({'hour': 'first', 'minutes': 'count'})
)

выход:

      hour  minutes
hour               
12      12        3
13      13        4

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