【问题标题】:Removing duplicates every 5 minutes [closed]每 5 分钟删除重复项 [关闭]
【发布时间】:2019-06-13 10:38:28
【问题描述】:

我正在尝试从数据集中删除每 5 分钟时间范围内出现的重复 ID。数据框看起来像这样;

|---------------------|------------------|------------------|
|          ID         |       Date       |        Time      |
|---------------------|------------------|------------------|
|          12         |     2012-1-1     |      00:01:00    |
|---------------------|------------------|------------------|
|          13         |     2012-1-1     |      00:01:30    |
|---------------------|------------------|------------------|
|          12         |     2012-1-1     |      00:04:30    |
|---------------------|------------------|------------------|
|          12         |     2012-1-1     |      00:05:10    |
|---------------------|------------------|------------------|
|          12         |     2012-1-1     |      00:10:00    |
|---------------------|------------------|------------------|

应该变成什么;

|---------------------|------------------|------------------|
|          ID         |       Date       |        Time      |
|---------------------|------------------|------------------|
|          12         |     2012-1-1     |      00:01:00    |
|---------------------|------------------|------------------|
|          13         |     2012-1-1     |      00:01:30    |
|---------------------|------------------|------------------|
|          12         |     2012-1-1     |      00:05:10    |
|---------------------|------------------|------------------|
|          12         |     2012-1-1     |      00:10:00    |
|---------------------|------------------|------------------|

第二次出现“12”时,应将其标记为重复,因为它在 00:00:00 - 00:05:00 时间范围内第二次出现。

我正在使用 pandas 来清理当前数据集。

感谢任何帮助!

【问题讨论】:

    标签: python pandas


    【解决方案1】:

    从添加 DatTim 列(类型为 DateTime)开始,获取源 日期时间的数据:

    df['DatTim'] = pd.to_datetime(df.Date + ' ' + df.Time)
    

    然后,假设ID 是一个“普通”列(不是索引), 你应该打电话:

    • groupbyDatTim 列上,5 min 频率。
    • 对每个组应用drop_duplicatessubset 仅包括ID 列。
    • 最后从索引中删除DatTim

    用Python表达上述指令:

    df2 = df.groupby(pd.Grouper(key='DatTim', freq='5min'))\
        .apply(lambda grp: grp.drop_duplicates(subset='ID'))\
        .reset_index(level=0, drop=True)
    

    如果你print(df2),你会得到:

       ID      Date      Time              DatTim
    0  12  2012-1-1  00:01:00 2012-01-01 00:01:00
    1  13  2012-1-1  00:01:30 2012-01-01 00:01:30
    3  12  2012-1-1  00:05:10 2012-01-01 00:05:10
    4  12  2012-1-1  00:10:00 2012-01-01 00:10:00
    

    要“清理”,您可以删除DatTim 列:

    df2.drop('DatTim', axis=1)
    

    编辑

    如果ID是索引,需要稍作改动:

    df2 = df.groupby(pd.Grouper(key='DatTim', freq='5min'))\
        .apply(lambda grp: grp[~grp.index.duplicated(keep='first')])\
        .reset_index(level=0, drop=True)
    

    然后打印出来的df2就是:

            Date      Time              DatTim
    ID                                        
    12  2012-1-1  00:01:00 2012-01-01 00:01:00
    13  2012-1-1  00:01:30 2012-01-01 00:01:30
    12  2012-1-1  00:05:10 2012-01-01 00:05:10
    12  2012-1-1  00:10:00 2012-01-01 00:10:00
    

    当然,在这种情况下,您也可以删除DatTim 列。

    【讨论】:

      猜你喜欢
      • 2012-06-30
      • 2016-07-10
      • 1970-01-01
      • 2017-06-11
      • 2017-06-13
      • 1970-01-01
      • 2014-06-30
      • 2021-08-22
      • 1970-01-01
      相关资源
      最近更新 更多