python - 如何根据条件过滤 pandas 系列值

标签 python pandas numpy

我有一个 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/

相关文章:

python - Pandas 外部合并返回错误值和额外的 Nan

python - 如何在 numpy ndarray 中获取每行的 N 个最大值?

python - 我在使用 im.show() 时遇到错误

python - 矢量化:掩码的每一行都包含要掩码的数组相应行的列索引

python - SQLAlchemy:在调用构造函数时返回现有对象而不是创建新对象

python - 如何将 functools.partial 与 os.path.join 一起使用?

pandas - pd.json_normalize() 出现 “str object has no attribute ' 值'

python - 如何从一个 pandas 数据帧中减去另一个数据帧的行?

python - ..../PM/src/pm3D.so : invalid ELF header

python - While 循环适用于中小型数据,但不适用于大量数据。 (Python)