Я хочу найти количество подходящих минут, имея час в группе. Поскольку я работаю с большим набором данных, можно ли использовать агрегатную функцию 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
Ваша помощь очень ценится.
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