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

如何用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)

代码说明

  1. pick_yes_first函数会检查分组后的字段值集合,只要存在Yes就返回Yes,否则返回No
  2. age和gender字段在同一Id下值完全一致,用first直接取第一个值即可
  3. groupby时设置as_index=False,确保Id作为普通列保留在结果中
  4. 导出Excel时添加index=False,避免多余的索引列干扰表格格式

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.10 09:01:36