如何基于Pandas DataFrame中的连续值修改布尔类型字段
解决同一ID下连续4个月Total为0时修改"Valid or Missing"字段的问题
首先得确保数据按ID和时间顺序排列,才能准确识别连续月份的记录,之后再针对性修改目标字段。以下是具体实现步骤:
步骤1:转换日期字段并排序
先把Year_Month转为日期类型,保证每个ID下的记录按时间先后排序——这是识别连续月份的基础:
# 转换Year_Month为日期格式 df['Year_Month'] = pd.to_datetime(df['Year_Month'], format='%Y-%m') # 按ID和时间排序 df = df.sort_values(['ID', 'Year_Month']).reset_index(drop=True)
步骤2:识别连续Total为0的分组
通过分组后计算连续0值的分组标识,用cumsum标记不同的连续区间:
# 按ID分组,标记非0的行,然后计算cumsum得到连续区间的ID df['zero_group'] = df.groupby('ID')['Total'].apply(lambda x: (x != 0).cumsum())
这里每遇到一个非0的Total,zero_group的值就会加1,同一连续0值的区间会拥有相同的zero_group值。
步骤3:标记符合条件的记录
筛选出连续4个月及以上Total为0的区间,标记这些区间内的所有记录:
# 统计每个zero_group的行数,筛选出行数>=4且全为0的组 valid_groups = df.groupby(['ID', 'zero_group']).filter(lambda x: len(x) >=4 and (x['Total'] == 0).all())['zero_group'].unique() # 标记需要修改的记录 df['need_update'] = df['zero_group'].isin(valid_groups) & (df['Total'] == 0)
步骤4:更新"Valid or Missing"字段
对标记为需要更新的记录,将"Valid or Missing"从True改为False,False保持不变:
# 应用更新逻辑 df.loc[df['need_update'] & df['Valid or Missing'], 'Valid or Missing'] = False # 可选:删除临时生成的辅助列 df = df.drop(['zero_group', 'need_update'], axis=1)
完整代码
整合所有步骤的完整代码如下:
import pandas as pd # 转换日期并排序 df['Year_Month'] = pd.to_datetime(df['Year_Month'], format='%Y-%m') df = df.sort_values(['ID', 'Year_Month']).reset_index(drop=True) # 标记连续0值的分组 df['zero_group'] = df.groupby('ID')['Total'].apply(lambda x: (x != 0).cumsum()) # 筛选符合条件的组并标记需要更新的记录 valid_groups = df.groupby(['ID', 'zero_group']).filter(lambda x: len(x) >=4 and (x['Total'] == 0).all())['zero_group'].unique() df['need_update'] = df['zero_group'].isin(valid_groups) & (df['Total'] == 0) # 更新字段 df.loc[df['need_update'] & df['Valid or Missing'], 'Valid or Missing'] = False # 清理临时列 df = df.drop(['zero_group', 'need_update'], axis=1)
这样就完成了需求:同一ID下连续4个月Total为0的记录,只要"Valid or Missing"是True,就会被改为False,已经是False的保持不变。
内容的提问来源于stack exchange,提问作者TheMaffGuy
相关产品推荐
相关产品推荐

