Ответ 1
EDIT для Pandas 0,17 или новее:
Поскольку аргумент take_last
метода duplicated()
был устарел в пользу нового аргумента keep
, поскольку Pandas 0.17, обратитесь к этому ответу за правильный подход:
- Вызовите метод
duplicated()
с помощьюkeep=False
, т.е.frame.duplicated(['key1', 'key2'], keep=False)
.
Поэтому для извлечения необходимых данных для этого конкретного вопроса достаточно:
In [81]: frame[frame.duplicated(['key1', 'key2'], keep=False)].groupby(('key1', 'key2')).min()
Out[81]:
data
key1 key2
1 2 5
2 2 1
[2 rows x 1 columns]
Интересно, что это изменение в Pandas 0,17 может быть частично связано с этим вопросом, как указано в этой проблеме.
Для версий, предшествующих Pandas 0.17:
Мы можем играть с аргументом take_last
метода duplicated()
:
take_last
:boolean
, по умолчаниюFalse
Для набора различных повторяющихся строк отметьте все, кроме последней строки, как дублированные. Значение по умолчанию для всех, кроме первой строки, помечено.
Если мы установим take_last
значение в True
, мы будем отмечать все, кроме последней повторяющейся строки. Объединив это вместе со значением по умолчанию False
, который обозначает все, кроме первой повторяющейся строки, позволяет отмечать все дублированные строки:
In [76]: frame.duplicated(['key1', 'key2'])
Out[76]:
0 False
1 False
2 False
3 True
4 True
5 False
6 True
7 True
dtype: bool
In [77]: frame.duplicated(['key1', 'key2'], take_last=True)
Out[77]:
0 True
1 True
2 False
3 False
4 True
5 False
6 True
7 False
dtype: bool
In [78]: frame.duplicated(['key1', 'key2'], take_last=True) | frame.duplicated(['key1', 'key2'])
Out[78]:
0 True
1 True
2 False
3 True
4 True
5 False
6 True
7 True
dtype: bool
In [79]: frame[frame.duplicated(['key1', 'key2'], take_last=True) | frame.duplicated(['key1', 'key2'])]
Out[79]:
key1 key2 data
0 1 2 5
1 2 2 6
3 1 2 6
4 2 2 1
6 2 2 2
7 2 2 8
[6 rows x 3 columns]
Теперь нам просто нужно использовать методы groupby
и min
, и я считаю, что вывод находится в необходимом формате:
In [81]: frame[frame.duplicated(['key1', 'key2'], take_last=True) | frame.duplicated(['key1', 'key2'])].groupby(('key1', 'key2')).min()
Out[81]:
data
key1 key2
1 2 5
2 2 1
[2 rows x 1 columns]