如何用Pandas或Excel按规则获取唯一行(Yes优先于No)
问题场景
现有如下数据集:
Id , age , gender , IsDiabetes, Is Obese, IsHeart 1 23 Female Yes No Yes 1 23 Female Yes Yes Yes 2 60 Male Yes No No 3 70 Female No No Yes 3 70 Female No Yes Yes
处理需求
针对同一Id的记录:
- 若
IsDiabetes、Is Obese、IsHeart字段中存在Yes,则该Id对应字段保留Yes,替换同组内的No - 去除冗余重复行,最终得到如下结果:
Id , age , gender , IsDiabetes, Is Obese, IsHeart 1 23 Female Yes Yes Yes 2 60 Male Yes No No 3 70 Female No Yes Yes
尝试过的无效代码
data1 = df.groupby('ID').agg(list)
这段代码会将每个分组的字段值转为列表,导出到Excel后完全不符合预期。
可行解决方案
通过自定义聚合函数实现优先保留Yes的逻辑:
import pandas as pd # 自定义聚合函数:优先返回"Yes",无"Yes"则返回"No" def pick_yes_first(series): return 'Yes' if 'Yes' in series.values else 'No' # 分组聚合处理 processed_df = df.groupby('Id', as_index=False).agg( age=('age', 'first'), gender=('gender', 'first'), IsDiabetes=('IsDiabetes', pick_yes_first), IsObese=('Is Obese', pick_yes_first), IsHeart=('IsHeart', pick_yes_first) ) # 导出到Excel(避免导出索引列) processed_df.to_excel('result.xlsx', index=False)
代码说明
pick_yes_first函数会检查分组后的字段值集合,只要存在Yes就返回Yes,否则返回Noage和gender字段在同一Id下值完全一致,用first直接取第一个值即可groupby时设置as_index=False,确保Id作为普通列保留在结果中- 导出Excel时添加
index=False,避免多余的索引列干扰表格格式
内容的提问来源于stack exchange,提问作者Pythona
相关产品推荐
相关产品推荐

