Pandas поиск совпадений в любой ячейке

Рейтинг: 0Ответов: 2Опубликовано: 09.08.2023

Есть фрейм типа:

Данные

Подскажите как удалить строки, где есть совпадения хотя бы в одном столбце (в моем случае это вторая строка 1, т.к. у нее в одном из столбцов значение 'a3' совпадате со начением из нулевой строки). При этом совпадения пустых ячеек должно игнорироваться, т.е. строки 2 и 3 не считаются совпадающими.

Ответы

▲ 3Принят

Разворачиваем фрейм в один столбец (Series) с мультииндексом, удаляем '', находим дубликаты, удаляем строки по индексам этих дубликатов.

df = pd.DataFrame(
    {'COL1': ['a1', 'a3', 'm100', 'w23'], 'COL2': ['a2', 'n1', 'k12', ''], 'COL3': ['a3', 'v4', '', 'y33'],
     'COL4': ['d1', 'v8', 'w54', 'e17']})
s = df.unstack().replace('', None).dropna().duplicated(keep=False)
print(df.drop(s[s].droplevel(0).index))
   COL1 COL2 COL3 COL4
2  m100  k12       w54
3   w23       y33  e17
▲ 0

Можно сделать так ещё:

df = df.drop(df.index[df.applymap(lambda x:
                             bool(len(x)) and
                             len(np.ravel(np.where(df==x)))>2)
        .any(axis=1)][1:])

df:

   COL1 COL2 COL3 COL4
0    a1   a2   a3   d1
2  m100  k12       w54
3   w23       y33  e17

Но это для общего сведения. решение с разворотом от @Алексей Р мне нравится больше.