Python如何实现条件均值 按指定列阈值分组计算对应列均值
pandas 按列条件计算另一列均值实现方法
针对你要按年龄阈值分段算平均薪资的需求,给两个最常用的实现方案,按需选就行。
方法1:布尔索引直接筛选(新手友好,逻辑直观)
核心思路就是先通过布尔条件筛出符合年龄要求的行,再直接对薪资列调用均值方法,代码可读性最高,刚上手也不容易写错。
import pandas as pd # 示例DataFrame,替换成你自己的实际数据即可 df = pd.DataFrame({ 'age': [24, 36, 40, 47, 29, 53, 33], 'salary': [7500, 16000, 21000, 27000, 14000, 32000, 18000] # 剩余两列字段不参与计算,不需要额外处理 }) # 计算40岁以下人群平均薪资,不包含40岁 salary_under_40 = df[df['age'] < 40]['salary'].mean() # 计算40岁以上人群平均薪资,要包含40岁就把>替换为>= salary_over_40 = df[df['age'] > 40]['salary'].mean()
小提醒:尽量保持「先筛选行、再取目标列」的写法顺序,避免触发pandas的链式索引警告,后续如果需要修改筛选后的数据也不容易出逻辑bug。默认情况下
mean()方法会自动跳过age、salary列中的空值,不需要手动写判空逻辑。
方法2:分箱分组计算(多分段场景更高效)
如果后续你需要加更多年龄分段(比如30以下、30-40、40-50、50以上),不用反复写筛选条件,用分箱+分组统计的方式一次性就能出所有分段的结果,数据量越大效率优势越明显:
# 按年龄阈值切分分箱 df['age_segment'] = pd.cut( df['age'], bins=[0, 40, float('inf')], # 分段边界,可自行加更多阈值 labels=['40岁及以下', '40岁以上'] # 对应分段的名称,和bins边界一一对应 ) # 按分组直接计算各段平均薪资 segment_salary_mean = df.groupby('age_segment')['salary'].mean()
避坑提示
- 不要写for循环逐行判断累加算均值,pandas的内置向量化方法比手写循环快数十倍,数据量过万的时候差距会非常明显
- 写阈值条件的时候注意边界逻辑:需要包含40岁就用
<=/>=,不需要包含就用</>,避免统计口径错了
内容的提问来源于stack exchange,提问作者timmtamsar
相关产品推荐
相关产品推荐

