如何通过一段时间来分组DataFrame?

2024-05-18 15:34:27 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一些来自日志文件的数据,希望按分钟对条目进行分组:

 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'])

数据框:

 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])


Tags: 数据formatsourcedfdatetimedatecountmin
2条回答

您可以在与数据帧长度相同的任何数组/序列上进行分组,即使计算的因子实际上不是数据帧的列。所以要按分钟分组,您可以:

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

如果要按分钟或其他方式分组,请将上面的内容与要使用的列混合使用:

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

就我个人而言,如果我想经常按列分组,只需向数据框中添加列来存储其中一些计算的内容(例如,“分钟”列)是很有用的,因为这样可以减少分组代码的冗长。

或者你可以试试这样的方法:

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

因为原来的答案已经很老了,熊猫也被引入了periods 现在有一种不同的解决方案:

df.groupby(df.index.to_period('T'))

另外,您可以resample

df.resample('T')

相关问题 更多 >

    热门问题