如何在Pandas DataFrame中查找最新连续0 cases_count的起始日期
问题:查找DataFrame中cases_count连续为0的最新连续段起始日期
给定如下结构的DataFrame:
| date | cases_count |
|---|---|
| 2023-04-02 | 3 |
| 2023-04-03 | 0 |
| 2023-04-04 | 0 |
| 2023-04-05 | 1 |
| 2023-04-06 | 0 |
| 2023-04-07 | 0 |
需要编写函数,找到cases_count连续为0的最新连续段的起始日期,示例中应返回2023-04-06。
此前尝试仅查找cases_count == 0的最新日期,但这种方法无法识别连续段的起始点,忽略了该日期之前的连续情况。
解决方案
可以通过对连续0值进行分组标记的方式实现,核心思路是:
- 标记0值行并按连续段分组
- 筛选出结束日期最晚的连续段,取其起始日期
以下是基于pandas的Python代码实现:
import pandas as pd def get_latest_zero_streak_start(df): # 复制数据避免修改原DataFrame df_copy = df.copy() # 转换日期格式并按时间排序 df_copy['date'] = pd.to_datetime(df_copy['date']) df_copy = df_copy.sort_values('date').reset_index(drop=True) # 标记是否为0值行 df_copy['is_zero'] = df_copy['cases_count'] == 0 # 生成连续段分组ID:非0值的累积和会区分不同的0值连续段 df_copy['group_id'] = (~df_copy['is_zero']).cumsum() # 提取所有0值连续段的起始、结束日期 zero_groups = df_copy[df_copy['is_zero']].groupby('group_id').agg( start_date=('date', 'min'), end_date=('date', 'max') ).reset_index() # 无0值连续段时返回None if zero_groups.empty: return None # 获取结束日期最晚的连续段,返回其起始日期 latest_group = zero_groups.loc[zero_groups['end_date'].idxmax()] return latest_group['start_date'].strftime('%Y-%m-%d') # 测试示例数据 data = { 'date': ['2023-04-02', '2023-04-03', '2023-04-04', '2023-04-05', '2023-04-06', '2023-04-07'], 'cases_count': [3, 0, 0, 1, 0, 0] } df = pd.DataFrame(data) print(get_latest_zero_streak_start(df)) # 输出:2023-04-06
逻辑说明:
- 先确保日期列是datetime类型并按时间排序,这是时间序列处理的基础
is_zero列标记每行是否为0值group_id通过对非0值的累积和生成,同一连续0值段会拥有相同的group_id- 对每个0值分组提取起始和结束日期,筛选出结束日期最晚的组,其起始日期就是目标结果
内容的提问来源于stack exchange,提问作者henry
相关产品推荐
相关产品推荐

