首页 > 解决方案 > 如果一小时内的数据点少于 3 个,则删除数据

问题描述

我对此很陌生,所以请多多包涵。我有一个 df ,其中索引为日期时间格式。我的其他列是浓度和仅由 1 组成的计数列。

时间戳 专注 数数
2018-01-01 08:07:00 32.675305 1
2018-01-01 08:20:00 22.816844 1
2018-01-01 08:28:00 17.183438 1
2018-01-01 08:37:00 18.591789 1

我想通过仅包含每小时记录至少 3 个浓度值的数据来清理 df。

我尝试按小时重新采样,然后得到计数列的总和,它显示每小时数据点的数量是否满足阈值 3。然后我可以删除计数小于 3 的行。

df2 = df.resample('H').sum()
df3 = df2[~(df2['Count'] < 3)]

但是,从这里开始,浓度也被求和了,最终我不想要。我想知道是否有办法回到我重新采样但没有清除数据之前?

还有另一种方法可以更好地做到这一点吗?

标签: pythonpandasgroup-bypandas-resample

解决方案


您可以一次组合多个操作,必须添加额外的行来说明

import pandas as pd
from io import StringIO

df = pd.read_csv(StringIO(
"""Timestamp    Concentration   Count
2018-01-01 08:07:00   32.675305   1
2018-01-01 08:20:00   22.816844   1
2018-01-01 08:28:00   17.183438   1
2018-01-01 09:37:00   18.591789   1
2018-01-01 09:37:00   18.591789   1"""), sep=" \s+", parse_dates=["Timestamp"])



>>> df[df.groupby(df.Timestamp.dt.floor('h'))['Count'].transform('count') > 2]
            Timestamp  Concentration  Count
0 2018-01-01 08:07:00      32.675305      1
1 2018-01-01 08:20:00      22.816844      1
2 2018-01-01 08:28:00      17.183438      1

正如前面的答案中已经提到的,groupby应该在 Timestamp 列上执行floor- 一个小时。然后,用于transform将每小时计数值分配给组。最后,只使用计数 > 2 的行。


推荐阅读