Одно из возможных решений:
Давайте начнем с создания вашего DataFrame (здесь я пропустил необходимый импорт):
d = {'id': [1,2,3,4,5,6,7,8], 'x': [1,2,3,4,1,4,3,4], 'y': [1,2,3,2,3,2,3,4]}
df = pd.DataFrame(data=d)
Обратите внимание, что значения индекса являются последовательными числами (от 0), которые будут использоваться позже.
Затем мы должны найти дублированные строки, помечающие все экземпляры ( keep = False ):
dups = df[df.duplicated(subset=['x', 'y'], keep=False)]
Затем эти дубликаты должны быть сгруппированы в x и y :
gr = dups.groupby(['x', 'y'])
Затем следует добавить номер группы, к которой принадлежит конкретная строка.
до df
как, например, grpNo
столбец.
df['grpNo'] = gr.ngroup()
Следующий шаг - найти первый и последний индекс строки, которая
были сгруппированы в первой группе (с группой № == 0) и сохранены в
ind1
и ind2
.
ind1 = df[df['grpNo'] == 0].index[0]
ind2 = df[df['grpNo'] == 0].index[-1]
Затем мы находим список значений индекса для удаления:
indToDel = df[(df.index > ind1) & (df.index <= ind2)].index
Чтобы выполнить фактическое удаление строк, мы должны выполнить:
df.drop(indToDel, inplace=True)
И последний шаг - удалить столбец grpNo
, который больше не нужен.
df.drop('grpNo', axis=1, inplace=True)
Результат:
id x y
0 1 1 1
1 2 2 2
2 3 3 3
7 8 4 4
Таким образом, весь сценарий может быть следующим:
import pandas as pd
d = {'id': [1,2,3,4,5,6,7,8], 'x': [1,2,3,4,1,4,3,4], 'y': [1,2,3,2,3,2,3,4]}
df = pd.DataFrame(data=d)
dups = df[df.duplicated(subset=['x', 'y'], keep=False)]
gr = dups.groupby(['x', 'y'])
df['grpNo'] = gr.ngroup()
ind1 = df[df['grpNo'] == 0].index[0]
ind2 = df[df['grpNo'] == 0].index[-1]
indToDel = df[(df.index > ind1) & (df.index <= ind2)].index
df.drop(indToDel, inplace=True)
df.drop('grpNo', axis=1, inplace=True)
print(df)