Используйте DataFrameGroupBy.shift
для сдвига по группам и сравнивайте ne
для !=
, цепочку с побитовым OR
- |
и фильтруйте по boolean indexing
:
m = df.groupby('name')['nickname'].shift(-1).ne('Y') | df['nickname'].ne('X')
df = df[m]
print (df)
name nickname
1 A Y
2 A X
3 A Z
5 B Y
7 B Y
8 C Y
10 C Y
11 C Y
РЕДАКТИРОВАТЬ:
df = pd.DataFrame({"name":["A", "A","A", "A", "B" ,"B","B" ,"B", "C", "C","C", "C"],
"nickname":["X","Y","X","Z","X","Y","X","X","Y", "X","Y", "Y"]})
print (df)
name nickname
0 A X
1 A Y
2 A X
3 A Z
4 B X
5 B Y
6 B X
7 B X
8 C Y
9 C X
10 C Y
11 C Y
m = df.groupby('name')['nickname'].shift(-1).ne('Y') | df['nickname'].ne('X')
df1 = df[m]
print (df1)
name nickname
1 A Y
2 A X
3 A Z
5 B Y
6 B X
7 B X
8 C Y
10 C Y
11 C Y
print(df[(df['nickname']!='X') | (df['nickname'].shift(-1)!='Y')])
name nickname
1 A Y
2 A X
3 A Z
5 B Y
6 B X
8 C Y
10 C Y
11 C Y