Здравствуйте, у меня есть фрейм данных, такой как
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
У кого-нибудь есть идея, пожалуйста?
Вы можете сгруппировать по 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