如何用Pandas条件Groupby取min及apply实现SubGroup的Output列生成
按SubGroup规则填充Output列的实现方案
嘿,我来帮你搞定这个DataFrame的填充需求!根据你给出的规则,我们可以通过groupby结合apply来实现,步骤和代码如下:
先明确填充逻辑
对每个SubGroup:
- 如果组内存在非空的HardDate,就用这个HardDate填充该组所有行的
Output列 - 如果组内没有有效的HardDate,就筛选出
Values不为空的记录,取其中最早(最小)的BookDate来填充
代码实现
首先确保你的日期列已经转为datetime类型(如果还没转的话):
import pandas as pd # 转换日期列格式为datetime类型 df[['BookDate', 'HardDate']] = df[['BookDate', 'HardDate']].apply(pd.to_datetime)
然后定义处理每个分组的函数,再通过apply批量处理:
def fill_output_group(group): # 提取组内非空的HardDate valid_hard_dates = group['HardDate'].dropna() if not valid_hard_dates.empty: # 取第一个有效的HardDate(假设同组的有效值是统一的) fill_value = valid_hard_dates.iloc[0] else: # 筛选Values非空的行,提取对应的BookDate valid_book_dates = group[group['Values'].notna()]['BookDate'] # 取最小的BookDate,若没有符合条件的记录则设为缺失值 fill_value = valid_book_dates.min() if not valid_book_dates.empty else pd.NA # 给当前组的Output列统一赋值 group['Output'] = fill_value return group # 按SubGroup分组并应用填充函数,group_keys=False避免新增分组索引列 df_filled = df.groupby('SubGroup', group_keys=False).apply(fill_output_group)
代码解释
groupby('SubGroup', group_keys=False):按SubGroup维度分组,group_keys=False可以避免结果里多出不必要的分组索引列fill_output_group函数:针对每个子分组做逻辑判断,先检查HardDate是否有有效值,没有的话再去匹配Values非空的最小BookDate,最后给整个组的Output列统一赋值- 额外处理了极端情况:如果某个组既没有有效HardDate,也没有Values非空的记录,会把Output设为
pd.NA,你可以根据实际业务需求修改这个默认值
比如用你给出的示例数据,Group1的SubG1有有效的HardDate10/10/2010,所以该组所有行的Output都会是这个日期;如果某个SubGroup没有HardDate有效值,就会从Values非空的记录里挑最早的BookDate来填充。
内容的提问来源于stack exchange,提问作者Quasar
相关产品推荐
相关产品推荐

