python - Pandas 按 block 而不是单个值进行分组

标签 python pandas dataframe grouping

现在我对使用 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()

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

我希望它能清楚地描述问题。

最佳答案

您问题的第一部分,如何按 4 小时的 block 进行分组很简单,并且在下面的两个选项中都得到了解决。 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

关于python - Pandas 按 block 而不是单个值进行分组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39547873/

相关文章:

python - Pandas:根据唯一值获取行中对应的列值

r - 有条件地用矩阵值替换 data.frame 列。 R 中的 VLOOKUP

python - 如何使用条件从现有列在数据框中创建新列?

python - Python 中替代开关的性能差异

python - pickle 不能与 PuLP 一起玩

python - 从集合创建一个 numpy 数组

python - 为什么我从 pandas/matplotlib 收到错误 "OverflowError: Python int too large to convert to C long"?

python - 合并时出现 Pandas KeyError

python - 通过在两个 Pandas 数据帧之间迭代来识别相似的值。

python - curl -u 和 python 请求之间有区别吗