如何查找具有重叠日期范围的行?

时间:2017-05-31 15:28:25

标签: python pandas

我的数据框包含如下数据(微小的数据子集):

enter image description here

我正在尝试找出一种方法,可以创建一个新数据框,其中包含具有相同值的所有行:carrierflightnumberdepartureAirport和{{ 1}}但也有重叠的日期范围。

重叠是指一行的arrivalAirport介于effectiveDateeffectiveDate之间,而另一条记录与我提及的其他列具有相同的值。

因此,在上面的示例中,前两行将被视为此示例(并且应该都包含在新数据帧中),但第三行不是。

我假设我想使用groupby,但我并不完全清楚我会应用什么聚合函数。以下是我到目前为止:

discontinuedDate

但显然我需要应用一个确定重叠而不是df.groupby(['carrier','flightnumber','departureAirport','arrivalAirport'])['effectiveDate', 'discontinuedDate'].min() 的函数。如何识别重叠而不是返回该组的最小值?

更新:

min()

更新2:

就输出而言,我希望任何行重叠并且在carrier flightnumber departureAirport arrivalAirport effectiveDate discontinuedDate 4U 9748 DUS GVA 2017-05-09 2017-07-12 4U 9748 DUS GVA 2017-05-14 2017-07-16 4U 9748 DUS GVA 2017-07-18 2017-08-27 AG 1234 SFO DFW 2017-03-09 2017-05-12 AG 1234 SFO DFW 2017-03-14 2017-05-16 carrierflightnumberdepartureAirport中返回的值相同新数据框。不需要为这些行包含任何其他数据。因此,对于上面的示例数据,下面的数据帧将是我想要的输出:

arrivalAirport

请注意,只排除了一条记录(carrier flightnumber departureAirport arrivalAirport effectiveDate discontinuedDate 4U 9748 DUS GVA 2017-05-09 2017-07-12 4U 9748 DUS GVA 2017-05-14 2017-07-16 AG 1234 SFO DFW 2017-03-09 2017-05-12 AG 1234 SFO DFW 2017-03-14 2017-05-16 的第三条记录) - 这是因为它的日期范围与同一航班的其他记录不重叠。

1 个答案:

答案 0 :(得分:2)

高级概念

  • 按所有日期排序,然后根据effectiveDate确定是否存在确切重叠的优先顺序。
  • 在排序之前初始化的交替的和负的累计和。关键是当累积总和高于1时发生重叠。当总和降至0时,一个连续的组结束。
  • 取消排序并确定零发生的位置......这些是重叠组的结束。
  • 拆分这些断点上的数据框索引,并仅采用拆分大小大于1的拆分。
  • 连接传递的分割并使用loc来获取切片的数据帧。
def overlaping_groups(df):
    n = len(df)
    cols = ['effectiveDate', 'discontinuedDate']
    v = np.column_stack([df[c].values for c in cols]).ravel()
    i = np.tile([1, -1], n)
    a = np.lexsort([-i, v])
    u = np.empty_like(a)
    u[a] = np.arange(a.size)
    e = np.flatnonzero(i[a].cumsum()[u][1::2] == 0)
    d = np.diff(np.append(-1, e))
    s = np.split(df.index.values, e[:-1] + 1)

    return df.loc[np.concatenate([g for j, g in enumerate(s) if d[j] > 1])]

gcols = ['carrier', 'flightnumber', 'departureAirport', 'arrivalAirport']
df.groupby(gcols, group_keys=False).apply(overlaping_groups)

  carrier  flightnumber departureAirport arrivalAirport effectiveDate discontinuedDate
0      4U          9748              DUS            GVA    2017-05-09       2017-07-12
1      4U          9748              DUS            GVA    2017-05-14       2017-07-16
3      AG          1234              SFO            DFW    2017-03-09       2017-05-12
4      AG          1234              SFO            DFW    2017-03-14       2017-05-16