如何识别多列重复且其他列含特定值的DataFrame行
处理DataFrame中特定重复分组的行删除需求
需求说明
给定一个多列多行的DataFrame,需识别并删除满足以下条件的行:
- 按
ID、LACT、FDAT、DATE列分组后,该分组内同时存在EVENT值为BRED和PREG的行 - 删除这类分组中的
PREG行
示例输入数据
ID FDAT LACT DATE EVENT 1 1/1/2022 1 31/1/2022 FRESH 1 1/1/2022 1 15/2/2022 LUT 1 1/1/2022 1 15/3/2022 BRED 1 1/1/2022 1 15/3/2022 OS 1 1/1/2022 1 15/3/2022 PREG 1 1/1/2022 1 30/3/2022 OS 1 1/1/2022 1 30/3/2022 PREG
原尝试代码的局限
以下代码仅筛选出重复分组中的PREG行,但无法判断分组内是否同时存在BRED,无法满足需求:
df.loc[(df.duplicated(['ID', 'LACT', 'FDAT', 'DATE'])) & (df['EVENT']=='PREG')]
解决方案
步骤1:标记需要删除的行
通过groupby+transform判断每个分组是否同时包含BRED和PREG,再定位到需要删除的PREG行:
# 标记每个分组是否同时存在BRED和PREG group_has_both = df.groupby(['ID', 'LACT', 'FDAT', 'DATE'])['EVENT'].transform( lambda x: ('BRED' in x.values) and ('PREG' in x.values) ) # 筛选出需要删除的行:EVENT为PREG且所在分组同时有BRED和PREG to_drop = (df['EVENT'] == 'PREG') & group_has_both
步骤2:删除目标行并生成结果
df_result = df[~to_drop].reset_index(drop=True)
最终结果
执行后得到的df_result如下:
ID FDAT LACT DATE EVENT 1 1/1/2022 1 31/1/2022 FRESH 1 1/1/2022 1 15/2/2022 LUT 1 1/1/2022 1 15/3/2022 BRED 1 1/1/2022 1 15/3/2022 OS 1 1/1/2022 1 30/3/2022 OS 1 1/1/2022 1 30/3/2022 PREG
内容的提问来源于stack exchange,提问作者JohnH
相关产品推荐
相关产品推荐

