我有一个数据帧(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)
我的困境是我不知道如何正确编写适当的代码来删除较长时间的行。 (保持行的持续时间较短),我对此进行了研究,并提出了上面的代码。任何帮助表示赞赏。
答案 0 :(得分: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 :(得分: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
提取这些索引。