Используйте boolean indexing
для фильтрации:
m1 = df['col1'].eq('T')
m2 = m1.groupby(df['id']).transform('sum').ne(1)
df = df[m1 | m2 ]
print (df)
id col1
0 2 T
1 2 T
3 4 T
4 6 G
5 6 G
Объяснение :
Сравните col1
для T
с eq
(==
):
m1 = df['col1'].eq('T')
print (m1)
0 True
1 True
2 False
3 True
4 False
5 False
Name: col1, dtype: bool
Количество True
значений для групп по transform
с sum
:
print (m1.groupby(df['id']).transform('sum'))
0 2.0
1 2.0
2 1.0
3 1.0
4 0.0
5 0.0
Name: col1, dtype: float64
Сравните для не равных на ne
(!=
):
m2 = m1.groupby(df['id']).transform('sum').ne(1)
print (m2)
0 True
1 True
2 False
3 False
4 True
5 True
Name: col1, dtype: bool
И соедините вместе |
для побитового ИЛИ:
print (m1 | m2)
0 True
1 True
2 False
3 True
4 True
5 True
Name: col1, dtype: bool