首页 > 解决方案 > Pandas GroupBy 不填写缺失数据

问题描述

我有一个半小时数据文件,我希望按小时分组。这有效:

data.groupby(pd.Grouper(freq='1h')).agg('sum')

但是,它会填充没有半小时数据的小时数。

如何执行这样的分组,但不创建输入 DataFrame 中没有数据的记录?例如来自:

07:00
07:30
09:00
09:30

我想创建:

07:00
09:00

不是:

07:00
08:00
09:00

谢谢

标签: pandaspandas-groupby

解决方案


如果您只是想过滤掉添加的时间,您可以按照cs95在评论中所说的或:

out = data.groupby(pd.Grouper(freq='1h')).sum(min_count=1).dropna()

如果min_countbin 没有数据,则使 NaN 成为输出,然后可以使用 删除dropna()

如果您不希望一开始就计算这些额外的箱子,这可能会更复杂(请注意,今天也有类似的公开帖子)。但是给定每小时的垃圾箱频率,您可以执行以下操作:

out1 = data.groupby(data.index.hour).sum()

如果数据跨越多天,您可以这样做:

out2 = data.groupby([data.index.date, data.index.hour]).sum()

但请注意,这里的数据索引datetime现在格式不正确,因此您可能需要转换回来。

这是我使用的示例数据:

import pandas as pd

dr = pd.date_range('1-1-2020 7:00', periods=6, freq='30min')
data = pd.DataFrame([10,20,30,40,50,60], index=dr, columns=['Values'])
data = data[data.index.hour != 8]

推荐阅读