基于分组日期值更新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)
代码逻辑说明
- 按
ID分组后,提取每组内所有Combined='finished'的行的年份集合 - 生成更新掩码:筛选出
bool=True且年份小于组内finished行最大年份的行 - 复制
Combined列的值到Update列,再用掩码定位并更新符合条件的行
内容的提问来源于stack exchange,提问作者user4740374
相关产品推荐
相关产品推荐

