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

Pandas中使用groupby聚合时如何保留NaN行不合并?

问题:GroupBy聚合时保留NaN对应行不合并

你需要用groupby和agg聚合数据集,但要求含NaN的分组不合并行,保留所有原始记录;不含NaN的分组正常聚合取最大值,避免默认groupby把同组NaN行合并成一行的情况。


初始代码与数据

import pandas as pd
import numpy as np

mydata = {'category' : [np.NaN, np.NaN, "a", "b", "b", "c"],'category2' : ["f", "f", "r", "h", "h", "j"], 'value' : ['12', '11', '10', '13', '15', '11']}
df = pd.DataFrame(mydata, columns=['category','category2','value'])

# 当前使用的聚合代码(会合并NaN行)
df = df.groupby(['category','category2'], dropna=False).agg({'value':'max'})

初始数据表格

category    category2   value
0   NaN              f       12
1   NaN              f       11
2   a                r       10
3   b                h       13
4   b                h       15
5   c                j       11

当前输出(不符合预期)

category  category2   value
0   NaN        f          12
1   a          r          10
2   b          h          15
3   c          j          11

期望输出

category  category2   value
0   NaN        f          12
1   NaN        f          11
2   a          r          10
3   b          h          15
4   c          j          11

解决方案:自定义分组标识

无需拆分DataFrame,通过给NaN行分配唯一分组ID,让它们在groupby时保持独立;非NaN行按原始分组键聚合,即可实现需求。

实现代码

import pandas as pd
import numpy as np

mydata = {'category' : [np.NaN, np.NaN, "a", "b", "b", "c"],'category2' : ["f", "f", "r", "h", "h", "j"], 'value' : ['12', '11', '10', '13', '15', '11']}
df = pd.DataFrame(mydata, columns=['category','category2','value'])

# 先将value转为数值类型(原数据为字符串,max操作需数值)
df['value'] = df['value'].astype(int)

# 创建分组标识:NaN行用索引作为唯一ID,非NaN行用(category, category2)组合
df['group_id'] = np.where(
    df['category'].isna(),
    df.index,
    df[['category', 'category2']].apply(tuple, axis=1)
)

# 分组聚合:每个分组取value的最大值
agg_result = df.groupby('group_id').agg({'value':'max'}).reset_index()

# 关联回原始分类列,去重后整理格式
final_result = pd.merge(
    agg_result,
    df[['group_id', 'category', 'category2']],
    on='group_id',
    how='left'
).drop_duplicates(subset=['group_id', 'category', 'category2', 'value']).drop('group_id', axis=1)

# 调整列顺序并重置索引
final_result = final_result[['category', 'category2', 'value']].reset_index(drop=True)
print(final_result)

输出结果

category category2  value
0      NaN         f     12
1      NaN         f     11
2        a         r     10
3        b         h     15
4        c         j     11

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 14:02:54