如何在Pandas中保留连续布尔值组的首个True及孤立True
问题:保留孤立True与连续True组的首个True
需求说明:处理布尔型Series,需保留两个False之间的孤立True,同时仅保留连续True组中的首个True,其余连续True转为False。
原始数据
Date 2023-07-10 00:00:00+00:00 False 2023-07-11 00:00:00+00:00 False 2023-07-12 00:00:00+00:00 False 2023-07-13 00:00:00+00:00 False 2023-07-14 00:00:00+00:00 False 2023-07-15 00:00:00+00:00 False 2023-07-16 00:00:00+00:00 False 2023-07-17 00:00:00+00:00 False 2023-07-18 00:00:00+00:00 False 2023-07-19 00:00:00+00:00 False 2023-07-20 00:00:00+00:00 False 2023-07-21 00:00:00+00:00 True 2023-07-22 00:00:00+00:00 False 2023-07-23 00:00:00+00:00 False 2023-07-24 00:00:00+00:00 False 2023-07-25 00:00:00+00:00 False 2023-07-26 00:00:00+00:00 False 2023-07-27 00:00:00+00:00 False 2023-07-28 00:00:00+00:00 False 2023-07-29 00:00:00+00:00 True 2023-07-30 00:00:00+00:00 True 2023-07-31 00:00:00+00:00 False 2023-08-01 00:00:00+00:00 False 2023-08-02 00:00:00+00:00 False 2023-08-03 00:00:00+00:00 False 2023-08-04 00:00:00+00:00 False 2023-08-05 00:00:00+00:00 True 2023-08-06 00:00:00+00:00 True 2023-08-07 00:00:00+00:00 True 2023-08-08 00:00:00+00:00 True Freq: D, Name: Close, dtype: bool
期望结果
Date 2023-07-10 00:00:00+00:00 False 2023-07-11 00:00:00+00:00 False 2023-07-12 00:00:00+00:00 False 2023-07-13 00:00:00+00:00 False 2023-07-14 00:00:00+00:00 False 2023-07-15 00:00:00+00:00 False 2023-07-16 00:00:00+00:00 False 2023-07-17 00:00:00+00:00 False 2023-07-18 00:00:00+00:00 False 2023-07-19 00:00:00+00:00 False 2023-07-20 00:00:00+00:00 False 2023-07-21 00:00:00+00:00 True 2023-07-22 00:00:00+00:00 False 2023-07-23 00:00:00+00:00 False 2023-07-24 00:00:00+00:00 False 2023-07-25 00:00:00+00:00 False 2023-07-26 00:00:00+00:00 False 2023-07-27 00:00:00+00:00 False 2023-07-28 00:00:00+00:00 False 2023-07-29 00:00:00+00:00 True 2023-07-30 00:00:00+00:00 False 2023-07-31 00:00:00+00:00 False 2023-08-01 00:00:00+00:00 False 2023-08-02 00:00:00+00:00 False 2023-08-03 00:00:00+00:00 False 2023-08-04 00:00:00+00:00 False 2023-08-05 00:00:00+00:00 True 2023-08-06 00:00:00+00:00 False 2023-08-07 00:00:00+00:00 False 2023-08-08 00:00:00+00:00 False Freq: D, Name: Close, dtype: bool
单行代码解决方案
假设你的布尔Series名为s,可以使用以下代码实现需求:
s = s & ~s.shift(fill_value=False)
代码解释
s.shift(fill_value=False):将原Series向下偏移一位,第一个位置用False填充,每个位置的值对应原Series中上一个位置的值。~s.shift(fill_value=False):对偏移后的Series取反,此时原Series里连续True的非首个位置会变成False(因为上一个位置是True,取反后为False),孤立True和连续True的首个位置则为True(上一个位置是False,取反后为True)。s & ~s.shift(...):将原Series与取反后的Series做逻辑与运算,只有当原位置是True且上一个位置是False时,结果才为True,刚好满足保留孤立True和连续True组首个True的需求。
内容的提问来源于stack exchange,提问作者Florent
相关产品推荐
相关产品推荐

