如何统计一个DataFrame中匹配另一个DataFrame键的对应数值?
解决方案
最优方案是用pandas内置的分组聚合+表关联逻辑,完全避免循环,性能比嵌套遍历高几个数量级。
步骤1:对df_b按key分组计算统计值
对df_b按keys字段分组,一次性统计每个key对应的数值总数、大于5的数值占比:
df_b_stats = df_b.groupby('keys').agg( total=('value', 'count'), # 统计每个key的记录总数 gt5_ratio=('value', lambda x: (x>5).mean()) # 直接通过布尔值均值计算大于5的占比 ).reset_index()
步骤2:把统计结果匹配到df_a中
用merge关联两个表的keys字段,保留df_a原有结构:
# 关联统计结果并重命名字段符合要求 df_a = df_a[['keys']].merge(df_b_stats, on='keys', how='left').rename(columns={'gt5_ratio': '>5'}) # 如果存在df_a有、df_b没有的key,需要填充默认值可加下面这行 # df_a = df_a.fillna({'total':0, '>5':0})
运行后得到的df_a完全符合预期输出要求。
原代码报错原因
之前的代码报错是因为iloc是按整数位置索引的接口,传入字符串'keys'属于非法参数;且嵌套循环的写法时间复杂度是O(n*m),数据量过万后性能会极差,不符合pandas的最佳实践。
内容的提问来源于stack exchange,提问作者lmmortaI
相关产品推荐
相关产品推荐

