Python Pandas中基于Pos_ID生成Emp_Type列结果全为'A'的问题
问题原因
- 判断逻辑错误:你定义的
manager、consult、ast是元组,但判断时用manager == code,这是拿整个元组和单个Pos_ID值比较,永远不会相等,所以所有分支都走到else,结果全是'A'。 - 语法遗漏:
for code in df['Pos_ID']后面缺少冒号:,如果实际运行没报错,应该是你输入时漏写了,但这是潜在语法问题。
解决方法
方法1:修正循环逻辑(不推荐,效率偏低)
把判断条件改成code in 元组的形式,补全语法:
manager = (11014,11015,11018,11024) consult = (11013, 11017) ast = (11016,11027) Emp_Type = [] for code in df['Pos_ID']: if code in manager: Emp_Type.append('M') elif code in consult: Emp_Type.append('C') else: Emp_Type.append('A') df['Emp_Type'] = Emp_Type
方法2:Pandas内置高效处理(推荐,适配5000+数据)
Pandas原生方法比Python循环快得多,适合批量数据处理,以下是几种常用方式:
方式A:字典映射 + map
先构建Pos_ID到员工类型的映射字典,再批量转换:
type_mapping = { 11014: 'M', 11015: 'M', 11018: 'M', 11024: 'M', 11013: 'C', 11017: 'C', 11016: 'A', 11027: 'A' } # 用fillna处理不在映射列表中的值,默认设为'A' df['Emp_Type'] = df['Pos_ID'].map(type_mapping).fillna('A')
方式B:replace批量替换
# 先替换经理和顾问的Pos_ID,未匹配的留空后填充为'A' df['Emp_Type'] = df['Pos_ID'].replace({ 11014: 'M', 11015: 'M', 11018: 'M', 11024: 'M', 11013: 'C', 11017: 'C' }) df['Emp_Type'] = df['Emp_Type'].fillna('A')
方式C:numpy.where多层条件判断
import numpy as np manager = (11014,11015,11018,11024) consult = (11013, 11017) df['Emp_Type'] = np.where( df['Pos_ID'].isin(manager), 'M', np.where(df['Pos_ID'].isin(consult), 'C', 'A') )
内容的提问来源于stack exchange,提问作者That_non_coder
相关产品推荐
相关产品推荐

