You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

基于分组日期值更新Pandas DataFrame的Combined列

Pandas分组更新指定列实现

原始DataFrame定义

import pandas as pd

data = {
    "ID": [1, 1, 1, 2, 2, 2],
    "Year": [2021, 2021, 2023, 2015, 2017, 2018],
    "Combined": ['started', 'finished', 'started', 'started', 'finished', 'started'],
    "bool": [True, False, False, True, False, False]
}
df = pd.DataFrame(data)
print(df)

需求说明

按ID分组处理,满足以下两个条件时,更新对应行的Combined值为finished(最终生成Update列):

  • 当前行的bool值为True
  • 同组内存在**年份晚于当前行年份(非同年)**且Combined值为finished的行

示例输出

ID  Year  Combined   bool    Update
1  2021   started   True   started
1  2021  finished  False  finished
1  2023   started  False   started
2  2015   started   True   finished
2  2017  finished  False  finished
2  2018   started  False   started

注:ID=1组中,bool=True的行(2021年)同组内没有年份更晚的finished行,因此不更新;ID=2组中,bool=True的行(2015年)存在2017年的finished行,符合条件,故更新为finished。

实现代码

def update_combined(group):
    # 获取组内所有finished行的年份
    finished_years = group[group['Combined'] == 'finished']['Year']
    # 判断bool=True的行是否存在更晚的finished记录
    update_mask = group['bool'] & (group['Year'] < finished_years.max())
    # 生成Update列,默认与Combined一致
    group['Update'] = group['Combined']
    # 更新符合条件的行
    group.loc[update_mask, 'Update'] = 'finished'
    return group

# 按ID分组应用处理逻辑
df_updated = df.groupby('ID', group_keys=False).apply(update_combined)
print(df_updated)

代码逻辑说明

  1. 按ID分组后,提取每组内所有Combined='finished'的行的年份集合
  2. 生成更新掩码:筛选出bool=True且年份小于组内finished行最大年份的行
  3. 复制Combined列的值到Update列,再用掩码定位并更新符合条件的行

内容的提问来源于stack exchange,提问作者user4740374

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.26 04:18:16