Первая идея - группировка по Grouper
с key='time'
и столбец host
с GroupBy.first
, а затем сумма за второй уровень:
df = (df.groupby(['host', pd.Grouper(key='time',freq='1Min')])['value']
.first()
.sum(level=1)
.reset_index(name='sum')
)
print (df)
time sum
0 14:00:00 7000
1 14:01:00 7000
Другое решение, если есть всего за несколько минут, поэтому возможно удаление дубликатов на host
и time
s на DataFrame.drop_duplicates
:
df = (df.drop_duplicates(subset=['host','time'])
.groupby([pd.Grouper(key='time',freq='1Min')])['value']
.sum()
.reset_index(name='sum'))
print (df)
time sum
0 14:00:00 7000
1 14:01:00 7000
df = (df.drop_duplicates(subset=['host','time'])
.groupby('time')['value']
.sum()
.reset_index(name='sum'))
print (df)
time sum
0 14:00:00 7000
1 14:01:00 7000
Решение с удалением дубликатов по группам также возможно, но медленно при больших объемах данных:
df = (df.groupby([pd.Grouper(key='time',freq='1Min')])
.apply(lambda x: x.loc[~x['host'].duplicated(), 'value'].sum())
.reset_index(name='sum'))
print (df)
time sum
0 14:00:00 7000
1 14:01:00 7000