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

如何用Pandas将多个虚拟变量合并为单列并计算类型均值?

反向虚拟编码(Undummy)实现方法

下面提供两种简洁的pandas操作方法,帮你将虚拟变量合并为分类列,并计算各职位的平均薪资:

方法一:利用idxmax快速生成分类列

因为你的数据中每行仅有一个虚拟变量值为1,其余为0,所以可以直接取每行最大值对应的列名作为职位类型:

import pandas as pd
data = {'salary' : [50000, 45000, 55000, 40000, 35000, 45000, 30000,25000,35000],
        'manager': [1,1,1,0,0,0,0,0,0], 'foreman': [0,0,0,1,1,1,0,0,0], 
        'worker': [0,0,0,0,0,0,1,1,1]}
df = pd.DataFrame(data=data)

# 生成type列:提取每行值为1的虚拟变量列名
df['type'] = df[['manager', 'foreman', 'worker']].idxmax(axis=1)

# 保留需要的salary和type列
df_clean = df[['salary', 'type']]
print(df_clean)

输出的df_clean就是仅包含薪资和职位类型的数据集:

salary      type
0   50000   manager
1   45000   manager
2   55000   manager
3   40000   foreman
4   35000   foreman
5   45000   foreman
6   30000    worker
7   25000    worker
8   35000    worker

方法二:用melt重塑数据(适用于更复杂的虚拟变量场景)

如果后续遇到多虚拟变量为1的情况,melt方法更通用,只需过滤值为1的行即可:

# 重塑数据,将虚拟变量列转为行
df_melt = df.melt(
    id_vars='salary',
    value_vars=['manager', 'foreman', 'worker'],
    var_name='type',
    value_name='is_type'
)

# 筛选出值为1的行,去掉无用列
df_clean = df_melt[df_melt['is_type'] == 1].drop('is_type', axis=1)

计算各职位平均薪资

得到df_clean后,直接用groupby计算平均:

avg_salary = df_clean.groupby('type')['salary'].mean().reset_index()
print(avg_salary)

输出结果:

type   salary
0   foreman  40000.0
1   manager  50000.0
2    worker  30000.0

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 00:01:28