如何在Python中计算出现至少三次的hit_num对应的score均值?
问题描述
我有一个DataFrame,需要根据hit_num列中值的出现次数,获取score列的均值。随机数据示例如下:
# 设置随机种子保证可复现 np.random.seed(42) # 创建随机DataFrame df = pd.DataFrame({'hit_num': np.random.randint(1,5,20), 'score': np.random.randint(1, 500, 20), }) df.sort_values(by='hit_num')
需求:仅保留hit_num出现次数≥3的条目,计算这些hit_num对应的score均值,最终生成包含hit_num和对应均值的新DataFrame。比如hit_num=1因出现次数不足被跳过,hit_num=2计算4个score的均值,hit_num=3计算7个score的均值。
尝试过的方法:
- 直接用
np.mean()或pandas的mean()方法,只能计算整列均值,无法按分组统计。 - 找到过指定行列求均值的示例:
df[['b', 'c']].iloc[[2,4]].mean(axis=0),但这是固定行列,不满足动态需求。 - 尝试用循环筛选,但不知道如何针对特定
hit_num计算对应score的均值,代码如下:
for hits in df: if df['hit_num'].value_counts() < 3: continue elif df['hit_num'].value_counts() => 3: df.mean()
解决方案
方法1:分组+过滤一步到位
利用pandas的groupby分组,结合filter筛选出出现次数≥3的组,再计算均值:
# 按hit_num分组,筛选出组大小≥3的,再计算score的均值 result = df.groupby('hit_num').filter(lambda x: len(x) >= 3).groupby('hit_num')['score'].mean().reset_index() # 重命名均值列更直观 result.rename(columns={'score': 'score_mean'}, inplace=True)
方法2:先统计次数再匹配计算
先统计每个hit_num的出现次数,再筛选出符合条件的hit_num,最后计算对应均值:
# 统计hit_num的出现次数 hit_counts = df['hit_num'].value_counts() # 筛选出出现次数≥3的hit_num valid_hits = hit_counts[hit_counts >= 3].index # 过滤原DataFrame,只保留有效hit_num,再分组计算均值 result = df[df['hit_num'].isin(valid_hits)].groupby('hit_num')['score'].mean().reset_index() result.rename(columns={'score': 'score_mean'}, inplace=True)
结果验证
运行上述任意一段代码后,生成的result就是符合需求的新DataFrame,包含出现次数≥3的hit_num及其对应的score均值。
内容的提问来源于stack exchange,提问作者Soef
相关产品推荐
相关产品推荐

