Как удалить строки с одинаковым значением в более чем 3 столбцах - PullRequest
0 голосов
/ 08 октября 2018

У меня ниже фрейма данных.

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 должно быть удалено.Мы видим, что во второй и третьей строках 5 и 7 столбцов имеют одинаковое значение соответственно.Нам нужно удалить эти строки.

Может кто-нибудь, пожалуйста, помогите мне.

Ответы [ 3 ]

0 голосов
/ 08 октября 2018

Вот наивный цикл Панд через 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
0 голосов
/ 08 октября 2018

Подход № 1

Для фрейма данных с 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
0 голосов
/ 08 октября 2018

Вы можете использовать набор, который имеет только уникальные значения.Если строка имеет 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)

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

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