我的数据框包含如下数据(微小的数据子集):
我正在尝试找出一种方法,可以创建一个新数据框,其中包含具有相同值的所有行:carrier
,flightnumber
,departureAirport
和{{ 1}}但也有重叠的日期范围。
重叠是指一行的arrivalAirport
介于effectiveDate
和effectiveDate
之间,而另一条记录与我提及的其他列具有相同的值。
因此,在上面的示例中,前两行将被视为此示例(并且应该都包含在新数据帧中),但第三行不是。
我假设我想使用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
,carrier
,flightnumber
和departureAirport
中返回的值相同新数据框。不需要为这些行包含任何其他数据。因此,对于上面的示例数据,下面的数据帧将是我想要的输出:
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
的第三条记录) - 这是因为它的日期范围与同一航班的其他记录不重叠。
答案 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