如何在DataFrame中按DateTimeStarted列分组,保留组尾Value为1其余置0且保留原0值
按DateTime分组修改Value的实现方法
核心逻辑
- 首先定位每个
DateTimeStarted分组下的最后一行位置 - 仅对原本Value为1的行做调整:同组内非最后一行的1全部置为0,组内最后一行的1保留原值
- 所有原本Value为0的行全程不参与修改,完全保留原有取值
具体代码实现
第一步:提取每个时间分组的最后一行索引
last_row_idx = df.groupby("DateTimeStarted").tail(1).index
第二步:生成调整后的Value列,可按需选择实现方式
- 中小数据量下的简洁写法:
df["Value"] = [ 1 if (val == 1) and (idx in last_row_idx) else 0 for idx, val in zip(df.index, df["Value"]) ]
- 大数据量下的高效向量化写法:
# 初始化新列全为0 new_val = pd.Series(0, index=df.index) # 定位需要保留为1的位置:满足「原取值为1」+「属于对应时间分组的最后一行」两个条件 keep_1_mask = (df["Value"] == 1) & df.index.isin(last_row_idx) new_val[keep_1_mask] = 1 df["Value"] = new_val
效果匹配说明
代码运行结果和你给出的目标输出完全一致:
2020-12-19 16:00:00分组(共19行、原Value全为1):仅最后一行(索引18)保留1,其余全部置为02020-12-26 18:00:00分组(共2行、原Value全为1):仅最后一行(索引20)保留1,前一行改为0- 所有原Value为0的行,无论是否属于重复时间分组,全部保持原有取值不变
内容的提问来源于stack exchange,提问作者DDM
相关产品推荐
相关产品推荐

