Как удалить строки с одинаковым значением в более чем 3 столбцах

61
4

У меня ниже Data Frame.

A   B   C   D   E   F   G
1 4 9 4 6 9 8
2 2 2 2 2 5 9
2 2 2 2 2 2 2
2 6 9 5 4 4 5
2 8 1 9 5 8 9
2 2 2 5 6 3 6

Мне нужен вывод, как показано ниже:

A   B   C   D   E   F   G
1 4 9 4 6 9 8
2 6 9 5 4 4 5
2 8 1 9 5 8 9
2 2 2 5 6 3 6

Это означает, что rows having more than three columns as same value должны быть удалены rows having more than three columns as same value. Мы видим, что во второй и третьей строках соответственно 5 и 7 столбцов. Нам нужно удалить эти строки.

Может ли кто-нибудь помочь мне.

спросил(а) 2021-01-19T17:55:45+03:00 2 месяца, 3 недели назад
1
Решение
75

Здесь наивный цикл Pandas через pd.DataFrame.apply и pd.Series.value_counts:

def max_count(s):
return s.value_counts().values[0]

res = df[df.apply(max_count, axis=1).le(3)]

print(res)

A B C D E F G
0 1 4 9 4 6 9 8
3 2 6 9 5 4 4 5
4 2 8 1 9 5 8 9
5 2 2 2 5 6 3 6

ответил(а) 2021-01-19T17:55:45+03:00 2 месяца, 3 недели назад
62

Подход №1

Для ints с ints, здесь векторизованный с bincount -

# https://stackoverflow.com/a/46256361/ @Divakar
def bincount2D_vectorized(a):
N = a.max()+1
a_offs = a + np.arange(a.shape[0])[:,None]*N
return np.bincount(a_offs.ravel(), minlength=a.shape[0]*N).reshape(-1,N)

out = df[(bincount2D_vectorized(df.values)<=3).all(1)]

Пример вывода -

In [563]: df[(bincount2D_vectorized(df.values)<=3).all(1)]
Out[563]:
A B C D E F G
0 1 4 9 4 6 9 8
3 2 6 9 5 4 4 5
4 2 8 1 9 5 8 9
5 2 2 2 5 6 3 6

ответил(а) 2021-01-19T17:55:45+03:00 2 месяца, 3 недели назад
43

Вы можете использовать набор, который имеет только уникальные значения. Если строка имеет 3 равных значения, то len (set (row)) = len (row) - 2. Итерации по файловому кадру, чтобы найти эти строки и сохранить их индексы.

indexes_to_remove = []
for index, row in df.iterrows():
if len(set(row)) < len(row) - 2:
indexes_to_remove.append(index)

Затем вы можете удалить их безопасно.

ответил(а) 2021-01-19T17:55:45+03:00 2 месяца, 3 недели назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема