我有一个 pandas 系列 pd.Series([-1, -1, -1, 0, 0, 0, -5, -5, 0, 0, 0, -1, -1, -1,-1])
。如何将其转换为 pd.Series([-1, 0, 0, 0, -5, -5, 0, 0, 0, -1])
。
过滤的条件是,如果连续出现的-1
大于或等于3
,则保留第一个出现的位置,并丢弃其余的。
由于第一个 -1
的条纹是 3
,因此我们保留 -1
并丢弃其余的。在第一个 3
值之后,条纹中断(因为该值现在为 0
)。同样,最后一个 -1
的条纹是 4
,因此我们保留 -1
并丢弃其余的。
过滤器仅适用于-1
,-5
应保持原样
谢谢
PS:我考虑过 groupby,但我认为它不符合我上面描述的 streak
方式
最佳答案
使用一些 SciPy 工具 -
from scipy.ndimage.morphology import binary_opening,binary_erosion
def keep_first_neg1s(s, W=3):
k1 = np.ones(W,dtype=bool)
k2 = np.ones(2,dtype=bool)
m = s==-1
return s[~binary_erosion(binary_opening(m,k1),k2) | ~m]
一个更简单的并且希望性能也更高 -
def keep_first_neg1s_v2(s, W=3):
m1 = binary_opening(a==-1, np.ones(W,dtype=bool))
return s[np.r_[True,~m1[:-1]]]
在给定示例s
上运行 -
# Using .tolist() simply for better visualization
In [47]: s.tolist()
Out[47]: [-1, -1, -1, 0, 0, 0, -5, -5, 0, 0, 0, -1, -1, -1, -1]
In [48]: keep_first_neg1s(s,W=3).tolist()
Out[48]: [-1, 0, 0, 0, -5, -5, 0, 0, 0, -1]
In [49]: keep_first_neg1s(s,W=4).tolist()
Out[49]: [-1, -1, -1, 0, 0, 0, -5, -5, 0, 0, 0, -1]
关于python - 如何根据条件过滤 pandas 系列值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57484734/