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

按年和ID聚合销售表添加age列时出现NaN值的问题求助

问题原因分析
  • 索引不匹配:聚合后的test DataFrame使用['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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.16 05:50:34