Pandas中如何合并含None/NaN的分组行?求更简洁实现方案
简洁实现按ID分组合并非空列数据
针对你提出的按id分组后,合并分组内仅含None或NaN的列数据的需求,我们可以利用Pandas的分组聚合能力大幅简化代码,避免手动处理集合的繁琐步骤。
原始数据与需求回顾
首先明确输入的DataFrame:
import pandas as pd import numpy as np df = pd.DataFrame({ 'id': [1, 2, 2], 'name': ['Peter', 'Max', None], 'age': [50.0, np.nan, 60.0] })
需求是按id分组后,将每组内仅含空值和一个有效值的列合并,得到如下结果:
age id name id 1 50.0 1 Peter 2 60.0 2 Max
简洁解决方案
基础版(无错误检查)
直接用groupby+agg完成聚合,逻辑清晰且代码简洁:
result = df.groupby('id').agg( id=('id', 'first'), # 同一组id唯一,取第一个即可 name=('name', lambda x: x.dropna().iloc[0]), # 过滤空值后取唯一有效值 age=('age', lambda x: x.dropna().iloc[0]) )[['age', 'id', 'name']] # 调整列顺序匹配预期结果
带错误检查版(兼容原代码逻辑)
如果需要保留原代码中“当分组内有多个非空有效值时提示错误”的逻辑,我们可以封装一个通用聚合函数,复用在多列上:
def get_single_valid(series): valid_values = series.dropna().unique() if len(valid_values) != 1: print(f'Error: {series.name} values are not mergeable: {valid_values}') return np.nan # 可根据需求返回默认值或抛出异常 return valid_values[0] result = df.groupby('id').agg( id=('id', 'first'), name=('name', get_single_valid), age=('age', get_single_valid) )[['age', 'id', 'name']]
思路说明
- 利用
groupby('id')完成分组,确保同一id的行被归为一组 - 通过
agg方法为每列指定聚合规则:id列:同一组内值完全相同,直接取第一个值即可name/age列:先通过dropna()过滤空值,由于需求保证分组内仅含一个有效值,所以取过滤后的第一个值就是我们需要的结果
- 最后调整列顺序,与预期输出结构完全匹配
内容的提问来源于stack exchange,提问作者Michael Dorner
相关产品推荐
相关产品推荐

