如何从Pandas DataFrame获取bcc列从False切换为True的日期列表
问题:如何从Pandas DataFrame中获取布尔列从False切换为True的日期列表?
我有一个以日期为索引的Pandas DataFrame,结构如下(共577行×7列):
| Date | High | Low | Open | Close | Volume | Adj Close | bcc |
|---|---|---|---|---|---|---|---|
| 2018-01-02 | 2695.889893 | 2682.360107 | 2683.729980 | 2695.810059 | 3367250000 | 2695.810059 | False |
| 2018-01-03 | 2714.370117 | 2697.770020 | 2697.850098 | 2713.060059 | 3538660000 | 2713.060059 | False |
| 2018-01-04 | 2729.290039 | 2719.070068 | 2719.310059 | 2723.989990 | 3695260000 | 2723.989990 | False |
| 2018-01-05 | 2743.449951 | 2727.919922 | 2731.330078 | 2743.149902 | 3236620000 | 2743.149902 | False |
| 2018-01-08 | 2748.510010 | 2737.600098 | 2742.669922 | 2747.709961 | 3242650000 | 2747.709961 | True |
| ... | ... | ... | ... | ... | ... | ... | ... |
| 2020-04-17 | 2879.219971 | 2830.879883 | 2842.429932 | 2874.560059 | 5792140000 | 2874.560059 | False |
我想要获取bcc列中布尔值从False切换为True的日期列表,比如示例中的2018-01-08就是符合条件的日期。请问该如何实现?
解决方案
要找出bcc列从False变为True的日期,我们可以利用Pandas的移位或差值计算函数来对比相邻行的值,这里提供两种实用方法:
方法一:基础移位对比法
直接通过shift(1)获取bcc列的前一行值,然后筛选出当前行是True且前一行是False的行:
# 构建筛选条件:当前行bcc为True,且前一行bcc为False mask = (df['bcc'] == True) & (df['bcc'].shift(1) == False) # 提取符合条件的日期并转为列表 switch_dates = df[mask].index.tolist()
方法二:使用diff()简化逻辑
布尔值在Pandas中会被自动转换为1(True)和0(False),所以从False到True的变化对应的差值正好是1,用diff()函数可以快速筛选:
# 计算相邻行的差值,筛选差值为1的行(即从False→True的变化) mask = df['bcc'].diff() == 1 switch_dates = df[mask].index.tolist()
补充说明
- 两种方法都能得到目标日期列表,
diff()的写法更简洁高效。 - 如果DataFrame的第一行
bcc就是True,两种方法都会自动忽略该行——因为不存在“从False切换”的前提,shift(1)会返回NaN,diff()的第一个值也是NaN,都不会被筛选出来,符合我们的需求。
用你提供的样本数据运行上述代码,会得到结果:
['2018-01-08']
内容的提问来源于stack exchange,提问作者Slartibartfast
相关产品推荐
相关产品推荐

