如何按一段时间将DataFrame分组?

serguei:

我从日志文件中获取了一些数据,想按分钟对条目进行分组:

 def gen(date, count=10):
     while count > 0:
         yield date, "event{}".format(randint(1,9)), "source{}".format(randint(1,3))
         count -= 1
         date += DateOffset(seconds=randint(40))

 df = DataFrame.from_records(list(gen(datetime(2012,1,1,12, 30))), index='Time', columns=['Time', 'Event', 'Source'])

df:

 Event  Source
 2012-01-01 12:30:00     event3  source1
 2012-01-01 12:30:12     event2  source2
 2012-01-01 12:30:12     event2  source2
 2012-01-01 12:30:29     event6  source1
 2012-01-01 12:30:38     event1  source1
 2012-01-01 12:31:05     event4  source2
 2012-01-01 12:31:38     event4  source1
 2012-01-01 12:31:44     event5  source1
 2012-01-01 12:31:48     event5  source2
 2012-01-01 12:32:23     event6  source1

我尝试了以下选项:

  1. df.resample('Min') 级别太高,想要汇总。
  2. df.groupby(date_range(datetime(2012,1,1,12, 30), freq='Min', periods=4)) 失败失败。
  3. df.groupby(TimeGrouper(freq='Min'))工作正常,并返回一个DataFrameGroupBy对象进行进一步处理,例如:

    grouped = df.groupby(TimeGrouper(freq='Min'))
    grouped.Source.value_counts()
    2012-01-01 12:30:00  source1    1
    2012-01-01 12:31:00  source2    2
                         source1    2
    2012-01-01 12:32:00  source2    2
                         source1    2
    2012-01-01 12:33:00  source1    1
    

但是TimeGrouper该类未记录。

在一段时间内进行分组的正确方法是什么?如何按分钟和“源”列对数据进行分组,例如groupby([TimeGrouper(freq='Min'), df.Source])

布伦·巴恩:

您可以对与DataFrame长度相同的任何数组/系列进行分组-甚至是实际上不是DataFrame列的计算因子。因此,按分钟分组可以:

df.groupby(df.index.map(lambda t: t.minute))

如果要按分钟分组,则可以将上面的内容与要使用的列混合使用:

df.groupby([df.index.map(lambda t: t.minute), 'Source'])

就我个人而言,如果我想经常对它们进行分组,我发现仅将列添加到DataFrame来存储其中一些计算出的内容(例如,“ Minute”列)很有用,因为这使分组代码的详细程度降低了。

或者您可以尝试这样的事情:

df.groupby([df['Source'],pd.TimeGrouper(freq='Min')])

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章