1

假设我有以下系列:

x = pd.Series([1,1,0,0,1,1,0,0,1,1])
print(x)

0    1
1    1
2    0
3    0
4    1
5    1
6    0
7    0
8    1
9    1

我想用一和零过滤掉第一行和最后一行(即保留从第一行到最后一个零的系列)。要查找第一个和最后一个零的索引,我执行以下操作:

zeros = x[x.eq(0)]  
from = zeros.first_valid_index()  
to = zeros.last_valid_index()

现在我想制作一个新系列,其中包含 和 之间的数据fromto即:

2    0
3    0
4    1
5    1
6    0
7    0

任何人都知道如何执行这最后一步?或者以更快的方式执行整个方法?

4

2 回答 2

1

from是关键字,不能用作变量,请使用loc

zeros = x[x.eq(0)]  
from_ = zeros.first_valid_index()  
to = zeros.last_valid_index()
print(x.loc[from_:to])

输出:

2    0
3    0
4    1
5    1
6    0
7    0
dtype: int64
于 2020-01-27T10:01:09.967 回答
1

Series.loc与更改from一起使用,f因为from是内置的,如果数据中至少存在一个0值,则解决方案有效:

zeros = x[x.eq(0)]  
f = zeros.first_valid_index()  
to = zeros.last_valid_index()

y = x.loc[f:to]
print (y)
2    0
3    0
4    1
5    1
6    0
7    0
dtype: int64

如果没有0值,一般解决方案也可以工作:

m = x.eq(0)
y = x[(m.cumsum() * m[::-1].cumsum()).ne(0)]
print (y)
2    0
3    0
4    1
5    1
6    0
7    0
dtype: int64

x = pd.Series([1,1,1])

zeros = x[x.eq(0)]  
f = zeros.first_valid_index()  
to = zeros.last_valid_index()

y = x.loc[f:to]
print (y)
0    1
1    1
2    1
dtype: int64

m = x.eq(0)
y = x[(m.cumsum() * m[::-1].cumsum()).ne(0)]
print (y)
Series([], dtype: int64)
于 2020-01-27T09:59:48.153 回答