如何对具有多列的df重新采样

Posted

技术标签:

【中文标题】如何对具有多列的df重新采样【英文标题】:How to resample a df with multiple columns 【发布时间】:2022-01-05 07:33:24 【问题描述】:

我有多个请求的分钟数据。我想将其重新采样为每小时并按请求分组,以便我可以获得每小时的请求总数

这就是数据的样子

    | RequestDate | Request | Count |
    | 2021-11-24 22:09:00 | Request 1 | 10 |
    | 2021-11-24 22:09:00 | Request 3 | 1 |
    | 2021-11-24 22:09:00 | Request 2 | 4 |
    | 2021-11-24 22:09:00 | Request 4 | 5 |
    | 2021-11-24 22:10:00 | Request 1 | 4 |
    | 2021-11-24 22:10:00 | Request 2 | 0 |
    | 2021-11-24 22:10:00 | Request 3 | 6 |
    | 2021-11-24 22:10:00 | Request 4 | 5 |
    | 2021-11-24 22:10:00 | Request 5 | 1 |

输出:

    | RequestDate | Request | Count |
    | 2021-11-24 22:00:00 | Request 1 | 14 |
    | 2021-11-24 22:00:00 | Request 2 | 4 |
    | 2021-11-24 22:00:00 | Request 3 | 7 |
    | 2021-11-24 22:00:00 | Request 4 | 10 |
    | 2021-11-24 22:00:00 | Request 5 | 1 |

我试过了,但以错误结束:

    df_groupby = df.groupby(by=[df["RequestDate"].resample('h'), "Request"])
    
    df_groupby["Request"]
    
    KeyError: 'RequestDate'

带有测试数据的df可以如下创建

df = pd.read_csv("test_data.csv")

test_data.csv

RequestDate,Request,RequestCount
2021-11-18 00:00:00,Request1,4
2022-11-18 00:00:00,Request2,4
2022-11-18 00:00:00,Request3,4
2022-11-18 00:00:00,/Request4,4
2022-11-18 00:00:00,Request5,4
2021-11-18 00:01:00,Request1,4
2021-11-18 00:02:00,Request1,2
2021-11-18 00:03:00,Request2,3
2022-11-18 00:04:00,Request3,4
2021-11-18 00:05:00,Request1,4

【问题讨论】:

请提供一个代码示例来创建数据框。这真的很容易,这可以分3步完成。记得用帖子里的代码格式写代码示例:符号。 @RobertoT - 我添加了用于创建测试 df 的代码示例 【参考方案1】:

我认为您的 groupby 行缺少一些关键括号\括号。

resample() 方法应用于groupby 对象,因此它应该在groupby() 完全关闭之后使用。也就是说,通常它是df.groupby(...).resample(...),但你在 groupby 中有重采样。

对于重采样,您还需要将 RequestDate 列作为您的索引(它可能在您的示例中,但如果不是,您需要使用 df = df.set_index('RequestDate'))。然后在 Request 列上进行 groupby。

RequestDate 还需要保存为日期时间(如果尚未保存)

总而言之,我认为你可以像这样得到你想要的:

df['RequestDate'] = pd.to_datetime(df['RequestDate']) # makes the column a datetime column, needed for resample
df = df.set_index('RequestDate')
df_grp = df.groupby('Request').resample('h').sum()
print(df_grp)

这给出了以下内容。您会注意到列的顺序不是您最初想要的:看起来RequestRequestDate 被设置为多索引。我敢肯定,如果需要,您可以重新安排它们,或者继续这样做。

Request RequestDate Count
 Request 1  2021-11-24 22:00:00 14
 Request 2  2021-11-24 22:00:00 4
 Request 3  2021-11-24 22:00:00 7
 Request 4  2021-11-24 22:00:00 10
 Request 5  2021-11-24 22:00:00 1

【讨论】:

谢谢@scotscotmcc。当我使用它时,我意识到实际数据在 2022 年的日期很少,并且对于直到 2022 年该范围内不存在的所有日期,它都显示为 0。

以上是关于如何对具有多列的df重新采样的主要内容,如果未能解决你的问题,请参考以下文章

将数据帧重新采样为具有任意期末月份的 n 个月期间

如何正确重新采样到 5 分钟

如何将多列重新排列为具有相同索引的一列

根据不同日期重新采样时间序列

如何在 Pyspark 中对数据框进行过采样?

将分布重新采样为具有最大可能数据记录的新分布