Pandas实现按ID列分组并保留分组内存在'Yes'的字段值
Pandas按ID分组聚合保留字段Yes值实现
原始数据
构造测试DataFrame的代码如下:
import pandas as pd data = [['123', 'Yes', 'No', 'No'], ['123', 'No', 'Yes', 'No'],['1234', 'No', 'Yes', 'No']] df = pd.DataFrame(data, columns=['ID', 'Object_1', 'Object_2', 'Object_3'])
原始数据预览:
| ID | Object_1 | Object_2 | Object_3 |
|---|---|---|---|
| 123 | Yes | No | No |
| 123 | No | Yes | No |
| 1234 | No | Yes | No |
需求说明
按ID列分组聚合,同一ID分组下的Object_1/Object_2/Object_3列,只要组内任意一行存在Yes值,聚合后该字段就保留Yes,全为No则保留No。
期望输出结果:
| ID | Object_1 | Object_2 | Object_3 |
|---|---|---|---|
| 123 | Yes | Yes | No |
| 1234 | No | Yes | No |
实现代码
直接用groupby配合自定义聚合函数即可,写法简洁不需要硬编码列名,后续新增Object列也能自动适配:
result = df.groupby('ID', as_index=False).agg( lambda col: 'Yes' if 'Yes' in col.values else 'No' )
运行后result就是符合要求的聚合结果。
如果数据量较大追求性能,可以先把Yes/No映射为布尔值,分组取最大值后再映射回文本,逻辑等价运行速度更快:
# 布尔映射:Yes为True,No为False,分组取max等价于判断是否存在True(即Yes) result = (df .set_index('ID') .replace({'Yes': True, 'No': False}) .groupby(level=0) .max() .replace({True: 'Yes', False: 'No'}) .reset_index() )
内容的提问来源于stack exchange,提问作者SMar3552
相关产品推荐
相关产品推荐

