按年和ID聚合销售表添加age列时出现NaN值的问题求助
问题原因分析
- 索引不匹配:聚合后的
testDataFrame使用['year','id']作为多级索引,而你直接用df['age']赋值时,原始df的索引是行号,和聚合后的索引完全不对应,Pandas无法找到匹配的行进行赋值,因此全部填充为NaN。 - 变量名错误:代码中写的是
order.groupby,但你的数据源是df,这属于笔误,若order未定义会直接报错。 - 聚合逻辑遗漏age关联:既然每个ID对应唯一的age值,你没有在聚合过程中把age和对应的id绑定,而是直接从原始df取整列,必然无法和聚合后的行对齐。
修复方案
方案1:聚合时直接保留age(利用ID唯一对应age的特性)
因为每个ID的age是唯一的,聚合时对age取first/max/min结果一致,可直接在agg中生成age列:
def table(df): test = df.groupby(['year','id']).agg( sales = ('sales', 'sum'), age = ('age', 'first') # 任意取唯一值的方法都可行 ) return test table(df)
方案2:先提取ID-age映射,再合并到聚合结果
若不想在聚合时处理age,可先建立ID与age的对应表,再通过merge关联:
def table(df): # 提取唯一的ID-age映射关系 id_age_map = df[['id', 'age']].drop_duplicates() # 聚合销售数据并重置索引 sales_agg = df.groupby(['year','id']).agg(sales = ('sales', 'sum')).reset_index() # 合并age列 test = sales_agg.merge(id_age_map, on='id', how='left') # 恢复多级索引(可选操作) test = test.set_index(['year','id']) return test table(df)
方案3:用transform生成聚合值后去重(适合保留原始结构的场景)
def table(df): # 生成每个year-id对应的销售总和 df['sales_sum'] = df.groupby(['year','id'])['sales'].transform('sum') # 去重保留每个year-id的唯一行 test = df[['year','id','sales_sum','age']].drop_duplicates(subset=['year','id']) # 重命名列并设置索引 test = test.rename(columns={'sales_sum':'sales'}).set_index(['year','id']) return test table(df)
内容的提问来源于stack exchange,提问作者Pixel
相关产品推荐
相关产品推荐

