Вы можете использовать itertools.product
для создания парного сравнения строк, а затем filter
в соответствии с указанными критериями:
import itertools as it
import pandas as pd
df = pd.read_csv('test.csv')
valid_pairs = filter(
lambda x: x[0][1] != x[1][1] and x[0][2] == x[1][2] and x[1][3] <= x[0][3] <= x[1][4],
it.product(zip(df['ID'], df['Status'], df['Date'], df['Min_time'], df['Max_time']), repeat=2)
)
valid_ids = ((x[0][0], x[1][0]) for x in valid_pairs)
ID_outer_loop, ID_inner_loop = zip(*valid_ids)
Создание только пар уникальных идентификаторов может быть достигнуто с помощьюиспользуя valid_ids = set(valid_ids)
.Если имеется много дубликатов valid_pairs
, это может сэкономить значительный объем памяти, поскольку все предыдущие шаги лениво вычисляются и оцениваются только при добавлении в набор (исключая дубликаты).
Другой способ, с помощью которого ярлыки на первомсовпадение для каждой пары идентификаторов - сначала groupby('ID')
, затем объедините группы в группы и, наконец, убедитесь, что после первого совпадения не выполняется вычисление с помощью any
:
valid_pairs = filter(
lambda g: any(x[0][0] != x[1][0] and x[0][1] == x[1][1] and x[1][2] <= x[0][2] <= x[1][3]
for x in zip(zip(g[0][1]['Status'], g[0][1]['Date'], g[0][1]['Min_time']),
zip(g[1][1]['Status'], g[1][1]['Date'], g[1][1]['Min_time'], g[1][1]['Max_time']))),
it.product(df.groupby('ID'), repeat=2)
)