Удалить строку, если она не содержит того же значения в пандах столбцов

Здравствуйте, у меня есть фрейм данных, такой как

COL1 COL2 
A    seq1
B    seq1
A    seq2
A    seq3
A    seq4
A    seq5
B    seq9
B    seq4 

И я хотел бы сохранить только строку, в которой А и Б в пределах COL1 имеют одинаковое значение COL2.

Я должен тогда получить;

COL1 COL2 
A    seq1
B    seq1
A    seq4
B    seq4 

У кого-нибудь есть идея, пожалуйста?

Почему в Python есть оператор "pass"?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Некоторые методы, о которых вы не знали, что они существуют в Python
Некоторые методы, о которых вы не знали, что они существуют в Python
Python - самый известный и самый простой в изучении язык в наши дни. Имея широкий спектр применения в области машинного обучения, Data Science,...
Основы Python Часть I
Основы Python Часть I
Вы когда-нибудь задумывались, почему в программах на Python вы видите приведенный ниже код?
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
LeetCode - 1579. Удаление максимального числа ребер для сохранения полной проходимости графа
Алиса и Боб имеют неориентированный граф из n узлов и трех типов ребер:
Оптимизация кода с помощью тернарного оператора Python
Оптимизация кода с помощью тернарного оператора Python
И последнее, что мы хотели бы показать вам, прежде чем двигаться дальше, это
Советы по эффективной веб-разработке с помощью Python
Советы по эффективной веб-разработке с помощью Python
Как веб-разработчик, Python может стать мощным инструментом для создания эффективных и масштабируемых веб-приложений.
0
0
48
3
Перейти к ответу Данный вопрос помечен как решенный

Ответы 3

Ответ принят как подходящий

Вы можете сгруппировать по COL2 (неинтуитивно, не так ли?) и получить количество уникальных элементов COL1 для каждой группы:

filtered_df = df[df.groupby('COL2')['COL1'].transform('nunique') == 2]

Выход:

>>> filtered_df
  COL1  COL2
0    A  seq1
1    B  seq1
4    A  seq4
7    B  seq4

Если у вас COL1 есть только 2 значения, вы также можете отфильтровать df значения в «COL1», merge на COL2; тогда melt:

out = (pd.melt(df[df['COL1']=='A'].merge(df[df['COL1']=='B'], on='COL2'), 
               id_vars=['COL2'], value_name='COL1')
       .drop(columns='variable')[['COL1', 'COL2']])

Выход:

  COL1  COL2
0    A  seq1
1    A  seq4
2    B  seq1
3    B  seq4

Вы также можете использовать pd.crosstab:

seq = pd.crosstab(df['COL1'], df['COL2']).all().loc[lambda x: x].index
out = df.loc[df['COL2'].isin(seq)]
print(out)

# Output
  COL1  COL2
0    A  seq1
1    B  seq1
4    A  seq4
7    B  seq4

Промежуточный результат:

>>> pd.crosstab(df['COL1'], df['COL2'])
COL2  seq1  seq2  seq3  seq4  seq5  seq9
COL1                                    
A        1     1     1     1     1     0
B        1     0     0     1     0     1

Другие вопросы по теме