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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.15 08:21:35