Использование:
df = df[df['x'].cumsum().mul(df['x'].iloc[::-1].cumsum()).ne(0)]
print (df)
x
2 1
3 0
4 3
5 1
Объяснение :
Получить cumsum
столбца:
print (df['x'].cumsum())
0 0
1 0
2 1
3 1
4 4
5 5
6 5
7 5
Name: x, dtype: int64
Инвертировать столбец и снова cumsum
:
print (df['x'].iloc[::-1].cumsum())
7 0
6 0
5 1
4 4
3 4
2 5
1 5
0 5
Name: x, dtype: int64
Умножить на Series.mul
:
print (df['x'].cumsum().mul(df['x'].iloc[::-1].cumsum()))
0 0
1 0
2 5
3 4
4 16
5 5
6 0
7 0
Name: x, dtype: int64
И проверить, не равен ли ne
(!=)
из 0
:
print (df['x'].cumsum().mul(df['x'].iloc[::-1].cumsum()).ne(0))
0 False
1 False
2 True
3 True
4 True
5 True
6 False
7 False
Name: x, dtype: bool
Последний фильтр по boolean indexing
.
Спасибо @Wen за другое решение:
df[(df.x.eq(0).cumprod().eq(0))&(df.x[::-1].eq(0).cumprod().eq(0))]