如何正确将初始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批量计算时,有几个小错误:
groupby后面要用括号(),不是方括号[]- lambda函数的逻辑错了:你要统计的是满足dau_xxx==1时的唯一user_client_id数量,不是对dau列本身取nunique
- 列名拼写错误:
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
相关产品推荐
相关产品推荐

