是否可以删除熊猫中具有特定条件的重复行?

问题描述 投票:2回答:3

我有一个数据帧(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)

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

python pandas numpy duplicates
3个回答
3
投票

使用sort_values,然后用drop_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
投票

假设持续时间全部在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')

1
投票

只需使用groupby

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

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

© www.soinside.com 2019 - 2024. All rights reserved.