Удаление последовательных повторяющихся строк, дублирование только для 2 столбцов - PullRequest
1 голос
/ 20 апреля 2020

У меня есть следующий пример кадра данных:

test = pd.DataFrame({'type': ['fruit', 'fruit', 'fruit', 'fruit', 'vegetable', 'vegetable', 'vegetable', 'vegetable'],
                    'name': ['orange', 'orange', 'apple', 'grape', 'leek', 'spinach', 'spinach', 'spinach'],
                    'value': ['100', '200', '300', '400', '500', '600', '700', '700']})

Я хочу удалить последовательные дубликаты строк, которые являются только дубликатами для:

test['type']

test['name']

Я видел, что общий решение состоит в том, чтобы использовать сдвиг, если он был для всего фрейма данных или отдельного столбца

# for a particular column

test[test.name != test.name.shift()]

Я в любом случае, чтобы он охватывал 2 столбца?

Большое спасибо за понимание

Ответы [ 3 ]

5 голосов
/ 20 апреля 2020

Простой с tuple

s = pd.Series(zip(test.type, test.name), test.index)
test[s != s.shift()]

        type     name value
0      fruit   orange   100
2      fruit    apple   300
3      fruit    grape   400
4  vegetable     leek   500
5  vegetable  spinach   600
3 голосов
/ 20 апреля 2020

2 столбца с any на axis=1:

test[test[['type','name']].ne(test[['type','name']].shift()).any(1)]

        type     name value
0      fruit   orange   100
2      fruit    apple   300
3      fruit    grape   400
4  vegetable     leek   500
5  vegetable  spinach   600
1 голос
/ 20 апреля 2020

Другой способ, но может не работать, если строки дублируются одна за другой:

Установить как мультииндекс

 test.set_index(['type','name'], inplace=True)

Удалить многоиндексные дубликаты

test = test.loc[~test.index.duplicated(keep='first')]

Сбросить индекс

 test.reset_index(inplace=True)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...