有没有一种方法可以删除熊猫中具有特定条件的重复行?

时间:2020-01-21 04:14:59

标签: python pandas numpy duplicates

我有一个数据帧(df),其中包含一些重叠的时间行。我想删除持续时间较长的行,并从相同的ID保留持续时间较短的行。 (以减少重叠)

    starttime                  endtime                      ID      Diff

    1/7/2020 2:32:15 PM        1/7/2020 2:32:16 PM          A       1 sec
    1/8/2020 2:33:20 PM        1/8/2020 2:33:22 PM          B       2 sec
    1/9/2020 5:35:00 AM        1/9/2020 5:35:25 AM          C       25 sec
    1/9/2020 5:35:05 AM        1/9/2020 5:35:25 AM          C       20 sec

我想要以下结果:

    starttime                  endtime                      ID      Diff

    1/7/2020 2:32:15 PM        1/7/2020 2:32:16 PM          A       1 sec
    1/8/2020 2:33:20 PM        1/8/2020 2:33:22 PM          B       2 sec
    1/9/2020 5:35:05 AM        1/9/2020 5:35:25 AM          C       20 sec

请注意,由于持续时间长于C组的第一行,因此删除了C组的第一行。

这是我的代码:

        import numpy as np
        import pandas as pd

        subset = df[df['diff'] >=  )
        df.drop(subset, inplace = True)

我的困境是我不知道如何正确编写适当的代码来删除较长时间的行。 (保持行的持续时间较短),我对此进行了研究,并提出了上面的代码。任何帮助表示赞赏。

3 个答案:

答案 0 :(得分:3)

依次使用sort_valuesdrop_duplicates

df.sort_values(['ID', 'Diff']).drop_duplicates(subset=['ID'])

输出:

             starttime              endtime ID  Diff
0  1/7/2020 2:32:15 PM  1/7/2020 2:32:16 PM  A     1
1  1/8/2020 2:33:20 PM  1/8/2020 2:33:22 PM  B     2
3  1/9/2020 5:35:05 AM  1/9/2020 5:35:25 AM  C    20

答案 1 :(得分:1)

假设持续时间全部在sec中,您可以:

将持续时间提取为整数并对其进行排序:

df['duration'] = df['Diff'].str.extract('(\d+)').astype(float)
df = df.sort_values('duration')

然后删除重复项

df = df.drop_duplicates(subset=['starttime','endtime','ID'], keep='first')

答案 2 :(得分:1)

只需使用groupby

df['Diff'] = df['Diff'].str.extract('(\d+)').astype(float)
print(df.loc[df.groupby('ID')['Diff'].idxmin()])

我首先仅从Diff列中的每个字符串中提取数值,然后将其转换为float,然后按ID列分组并使用每个组的最小值,然后使用loc提取这些索引。