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

如何正确将初始DataFrame的计算指标合并至新DataFrame及代码问题排查

解决你的Pandas分组计算问题

我来帮你一步步理清问题所在,然后给出简单易懂的解决方案~

第一个问题:分组列为空的原因

你一开始创建了空的result_raw DataFrame,然后直接把groupby的结果赋值给列,但这里有个关键问题:groupby后的结果是一个以分组列(date_diff、attributes_platform、l2)为索引的Series,而你的空DataFrame默认是数字索引,所以赋值后分组列并不会自动变成result_raw的普通列,导致你看到这些列是空的。

修正方法(推荐高效写法)

不要先创建空DataFrame,直接通过分组聚合一次性生成所有指标,这样分组列会自动保留为普通列。下面是具体代码:

def calculate_group_metrics(group):
    # 针对每个分组,计算各个dau指标对应的唯一用户数
    return pd.Series({
        'dau_view': group[group['dau_view'] == 1]['user_client_id'].nunique(),
        'dau_click': group[group['dau_click'] == 1]['user_client_id'].nunique(),
        'dau_to_cart': group[group['dau_to_cart'] == 1]['user_client_id'].nunique(),
        'dau_preorder': group[group['dau_preorder'] == 1]['user_client_id'].nunique(),
        'dau_order': group[group['dau_order'] == 1]['user_client_id'].nunique(),
        'dau_ps': group[group['dau_ps'] == 1]['user_client_id'].nunique()
    })

# 分组计算并重置索引,让分组列变成普通列
result_raw = merged_stats_skuranks_df.groupby(
    ['date_diff','attributes_platform','l2']
).apply(calculate_group_metrics).reset_index()

第二个问题:批量agg写法的错误修正

你尝试用agg批量计算时,有几个小错误:

  1. groupby后面要用括号(),不是方括号[]
  2. lambda函数的逻辑错了:你要统计的是满足dau_xxx==1时的唯一user_client_id数量,不是对dau列本身取nunique
  3. 列名拼写错误:dau_tocart应该是dau_to_cart(和原始列名保持一致)

正确的批量agg写法

如果想用agg实现,也可以这样写:

# 定义聚合函数字典
agg_dict = {
    # 对每个dau指标,过滤出等于1的行后统计唯一用户数
    'dau_view': lambda x: merged_stats_skuranks_df.loc[x.index, 'user_client_id'][x == 1].nunique(),
    'dau_click': lambda x: merged_stats_skuranks_df.loc[x.index, 'user_client_id'][x == 1].nunique(),
    'dau_to_cart': lambda x: merged_stats_skuranks_df.loc[x.index, 'user_client_id'][x == 1].nunique(),
    'dau_preorder': lambda x: merged_stats_skuranks_df.loc[x.index, 'user_client_id'][x == 1].nunique(),
    'dau_order': lambda x: merged_stats_skuranks_df.loc[x.index, 'user_client_id'][x == 1].nunique(),
    'dau_ps': lambda x: merged_stats_skuranks_df.loc[x.index, 'user_client_id'][x == 1].nunique()
}

# 执行分组聚合并重置索引
result_raw = merged_stats_skuranks_df.groupby(
    ['date_diff','attributes_platform','l2']
).agg(agg_dict).reset_index()

不过相比之下,前面的apply写法更直观,新手更容易理解和调试。

额外提醒

如果你的原始DataFrame里还有view列需要加入结果,直接在calculate_group_metrics里加上对应的逻辑即可,比如:

def calculate_group_metrics(group):
    return pd.Series({
        # 其他指标...
        'view': group['view'].sum()  # 或者你需要的其他计算逻辑
    })

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.29 22:52:31