熊猫按块分组而不是单个值

Posted

技术标签:

【中文标题】熊猫按块分组而不是单个值【英文标题】:Pandas group by chunks not single values 【发布时间】:2016-09-17 14:22:29 【问题描述】:

现在我对使用 pandas 进行分组有点困惑。

我有一组包含 3 列的数据(超过 60k 行):

2015/12/18 11:12:49 +0300   d1  b1
2015/12/18 11:12:50 +0300   d2  b2
2015/12/18 11:13:08 +0300   d1  b3
2015/12/18 11:13:36 +0300   d2  b4
2015/12/18 11:13:43 +0300   d2  b5
2015/12/18 11:14:21 +0300   d2  c0
2015/12/18 11:14:42 +0300   d2  c1
2015/12/18 11:15:13 +0300   d1  c2
2015/12/18 11:15:19 +0300   d3  c3

我需要获取按时间段(例如 0-4、4-8、8-12 等按 4 小时)和工作日分组的行数,然后在一周内获得一组时间段。

我可以得到一周中每个小时的总和(时间是第一列的名称):

dind = pd.DatetimeIndex(df.time)
gr = df.groupby([dind.weekday, dind.hour])
gr.size()

但我不知道如何按块分组,然后将生成的 MultiIndex 合并到单个索引列中。

我希望这是对问题的清晰描述。

【问题讨论】:

【参考方案1】:

您的问题的第一部分,如何按 4 小时的块分组很容易,并在下面的两个选项中得到解决。 df.index.hour // 4

第二部分含糊不清,因为有几种方法可以解释“合并为一列”。我为你提供了两种选择。

选项 1

gpd = df.groupby([df.index.weekday, df.index.hour // 4]).size()
gpd.index = gpd.index.to_series()
gpd

(4, 2)    9
dtype: int64

选项 2

gpd = df.groupby([df.index.weekday, df.index.hour // 4]).size()
gpd.index = ['_'.format(*i) for i in gpd.index]
gpd

4_2    9
dtype: int64

【讨论】:

谢谢。像魅力一样工作。 如果你不介意我有相关的问题。如何按天分块?比如说df.groupby([dind.date // N]),但是日期对象不能被分割。 @gudvinr df.groupby(pd.TimeGrouper('3D'))

以上是关于熊猫按块分组而不是单个值的主要内容,如果未能解决你的问题,请参考以下文章

熊猫计数分组值[重复]

大熊猫分组并总和显示值

如何在熊猫 DataFrame 中对连续值进行分组

我如何在熊猫中分组然后对值求和? [复制]

在熊猫数据框中按日期和计数值分组

将熊猫数据框按两列分组而不汇总