对时间列进行分组并仅汇总唯一值

时间:2020-06-17 05:02:53

标签: python pandas dataframe

我有一个{列{1}}的熊猫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     

我想在groupby期间忽略重复的主机。

1 个答案:

答案 0 :(得分:0)

第一个想法是将array([3, 1, 0, 4, 4]) Grouper分组,将key='time'列与GroupBy.first分组,然后每秒汇总:

host

另一种解决方案,如果只有几分钟的时间,那么可以通过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 删除重复项,而通过DataFrame.drop_duplicates删除host项:

time

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