Проверка и удаление дублированных значений соседей в последовательности строк для DataFrame - PullRequest
1 голос
/ 18 сентября 2019

У меня есть набор строк в кадре данных, которые имеют несколько повторяющихся соседних значений, которые расположены в в той же позиции каждого столбца и выглядят так:

row_data = pd.DataFrame({0 : [1.1, 1.2, 1.2, 1.3, 1.4, 1.5, 1.5, 1.6],
1 : [2.3, 2.2, 2.2, 2.3, 2.4, 2.5, 2.5, 2.6],
2 : [2.4, 2.2, 2.2, 2.3, 2.4, 2.6, 2.6, 2.7],
3 : [7.1, 7.2, 7.2, 7.3, 7.4, 7.5, 7.5, 7.6]}).T

Каккак указано выше (1.2, 1.2) в строке 0 находится в том же положении, что и (2.2, 2.2) в строке 1, (2.2, 2.2) в строке 2 и (7.2, 7.2) в строке 3 и т. д.

Я хочу иметь возможность сначала проверить, есть ли дубликаты соседей в каждой строке, удалить дубликаты , оставив только первый экземпляр этого , и подсчитатьиз числа всего дубликатов было удалено.

Я пытался выполнять итерации по каждой строке, но это слишком много времени, так как этот кадр данных очень большой (36 строк на 260 000 столбцов).Псевдокод, который я хотел бы иметь, следовал бы этой логике:

count_dup = 0
for index in range(0, len(row_data.columns)):
    if row_data[index] == row_data[index+1]:
         count_dup = count_dup + 1
         row_data[index] = np.nan

Мой псевдокод, очевидно, не работает, но остальное было бы удалить NAN, удалив дубликаты из всех столбцов.

Вывод будет:

row_data_dropped = pd.DataFrame({0 : [1.1, 1.2, 1.3, 1.4, 1.5, 1.6],
1 : [2.3, 2.2, 2.3, 2.4, 2.5, 2.6],
2 : [2.4, 2.2, 2.3, 2.4, 2.6, 2.7],
3 : [7.1, 7.2, 7.3, 7.4, 7.5, 7.6]}).T

total_dropped_neighbors = 8

Можно ли как-нибудь это сделать?

1 Ответ

1 голос
/ 19 сентября 2019

IIUC, вот что я бы попробовал:

non_dups = row_data.ne(row_data.shift(1,axis=1)).any()

row_data.loc[:,non_dups]

Вывод:

     0    1    3    4    5    7
0  1.1  1.2  1.3  1.4  1.5  1.6
1  2.3  2.2  2.3  2.4  2.5  2.6
2  2.4  2.2  2.3  2.4  2.6  2.7
3  7.1  7.2  7.3  7.4  7.5  7.6
...