группировка по столбцу времени и суммирование только уникальных значений - PullRequest
1 голос
/ 17 июня 2020

У меня есть pandas df со столбцом time, host, value

Данные, как показано ниже

time          host     value
14:00:00      inf1     5000
14:00:00      inf2     2000
14:01:00      inf1     5000
14:01:00      inf1     5000
14:01:00      inf2     2000

Я хочу сгруппировать их по времени, что я делаю с помощью приведенного ниже кода : -

df.set_index('time').groupby([pd.Grouper(freq='1Min')]).sum()

Но я хочу только суммировать уникальные хосты и игнорировать любые повторяющиеся хосты. Мой желаемый результат -

    time          sum     
    14:00:00      7000     
    14:01:00      7000     

, а не: -

time          sum     
14:00:00      7000     
14:01:00      12000 

Я хочу игнорировать повторяющиеся хосты во время группировки.

1 Ответ

0 голосов
/ 17 июня 2020

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