Вот способ сделать это:
l = ('P1.adv', 'P2.cmp', 'P3.part' )
m1 = df.groupby('col1').apply(lambda x: x.col2.str.startswith(l, na=False)).reset_index()
m2 = df[m1.col2].groupby('col1').col2.nunique() > 2
df[df.col1.isin(m2[m2].index.values)]
ID col1 col2
0 1 A P1.adv abcd
1 2 A P2.cmp kmasd
2 3 A P3.part lpw
Объяснение
Вы можете начать с проверки того, какие строки в df
содержат col2
, который начинаетсяс одним из элементов в списке, используя str.startswith
.
print(m1)
col1 level_1 col2
0 A 0 True
1 A 1 True
2 A 2 True
3 B 3 True
4 B 4 True
5 C 5 True
6 C 6 True
После того, как вы можете сгруппировать col1
и проверить, что количество уникальных элементов больше 2 (это означает, чтокаждый из элементов в списке присутствует хотя бы один раз), используя GroupBy.nunique()
:
print(m2)
col1
A True
B False
C False
Name: col2, dtype: bool
и, наконец, используйте логическое индексирование для оригинального df
, используя m2
:
result = df[df.col1.isin(m2[m2].index.values)]
print(result)
ID col1 col2
0 1 A P1.adv abcd
1 2 A P2.cmp kmasd
2 3 A P3.part lpw