【发布时间】:2021-08-03 12:30:26
【问题描述】:
我在 pandas 数据框中有一些数据,其中包含一个排名列、一个开始日期和一个结束日期。数据按排名列从最低到最高排序(因此开始/结束日期是无序的)。我希望删除日期范围与任何以前的行重叠的每一行
通过一个玩具示例:
原始数据
Rank Start_Date End_Date
1 1/1/2021 2/1/2021
2 1/15/2021 2/15/2021
3 12/7/2020 1/7/2021
4 5/1/2020 6/1/2020
5 7/10/2020 8/10/2020
6 4/20/2020 5/20/2020
想要的结果
Rank Start_Date End_Date
1 1/1/2021 2/1/2021
4 5/1/2020 6/1/2020
5 7/10/2020 8/10/2020
解释:第 2 行被删除,因为它的开始与第 1 行重叠,第 3 行被删除,因为它的结束与第 1 行重叠。第 4 行被保留,因为它不与任何先前保留的行(即第 1 行)重叠。同样,保留第 5 行,因为它不与第 1 行或第 4 行重叠。第 6 行被删除,因为它与第 4 行重叠。
尝试:
- 我可以使用 np.where 来检查前一行与当前行并创建一个“重叠”列,然后过滤此列。但这不满足我的要求(即在上面的玩具示例中,第 3 行将被包括在内,因为它不与第 2 行重叠,但由于它与第 1 行重叠,因此应排除在外)。
df['overlap'] = np.where((df['start']> df['start'].shift(1)) &
(df['start'] < df['end'].shift(1)),1 ,0)
df['overlap'] = np.where((df['end'] < df['end'].shift(1)) &
(df['end'] > df['start'].shift(1)), 1, df['overlap'])
- 我已经尝试了基于这个问题Removing 'overlapping' dates from pandas dataframe 的答案的实现,使用结束日期的回溯期,但是我的开始日期和结束日期之间的天数不是恒定的,而且它似乎不会产生还是正确答案
target = df.iloc[0]
day_diff = abs(target['End_Date'] - df['End_Date'])
day_diff = day_diff.reset_index().sort_values(['End_Date', 'index'])
day_diff.columns = ['old_index', 'End_Date']
non_overlap = day_diff.groupby(day_diff['End_Date'].dt.days // window).first().old_index.values
results = df.iloc[non_overlap]
谢谢,任何帮助都将非常非常感激!
【问题讨论】:
-
日期格式是什么?月/日/年?
-
是 - 美国格式。