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
相关产品推荐
相关产品推荐

