Python中基于字符串值差异识别正式经理与代理经理
解决DataFrame新增Status列的逻辑问题
问题梳理
需要给DataFrame新增Status列,规则如下:
- 当
Emp_Level为Emp时,Status为Emp - 当
Emp_Level为Mgr时:- 若
Name包含(Stand in),Status为Partial - 否则
Status为Full
- 若
原代码的问题
你写的代码有三个关键错误:
- 正则转义问题:
(Stand in)里的括号是正则的特殊字符,默认str.contains启用正则模式,导致无法正确匹配包含(Stand in)的名称 - 拼写错误:把
Partial写成了Partical - 逻辑与输出值不符:嵌套顺序错误,而且输出的
Manager/Employee和期望的Full/Emp不匹配
修正后的代码
方法1:修正np.where逻辑
import pandas as pd import numpy as np # 构造原始数据 data = { 'ID': [101, 102, 103, 104, 105, 106], 'Name': ['Adam', 'Betty', 'Chris(Stand in)', 'Dave', 'Emily(Stand in)', 'Frank'], 'Emp_Level': ['Emp', 'Mgr', 'Mgr', 'Emp', 'Mgr', 'Mgr'] } df = pd.DataFrame(data) # 新增Status列 df['Status'] = np.where( df['Name'].str.contains('\(Stand in\)', regex=True), # 转义括号以匹配字面量 'Partial', np.where( df['Emp_Level'] == 'Mgr', 'Full', 'Emp' ) ) print(df)
或者更简单的方式,直接关闭正则模式(匹配字面量的(Stand in)):
df['Status'] = np.where( df['Name'].str.contains('(Stand in)', regex=False), 'Partial', np.where(df['Emp_Level'] == 'Mgr', 'Full', 'Emp') )
方法2:用apply自定义逻辑(更直观)
def get_status(row): if row['Emp_Level'] == 'Emp': return 'Emp' elif '(Stand in)' in row['Name']: return 'Partial' else: return 'Full' df['Status'] = df.apply(get_status, axis=1)
输出结果
执行后会得到你期望的结果:
ID Name Emp_Level Status 0 101 Adam Emp Emp 1 102 Betty Mgr Full 2 103 Chris(Stand in) Mgr Partial 3 104 Dave Emp Emp 4 105 Emily(Stand in) Mgr Partial 5 106 Frank Mgr Full
内容的提问来源于stack exchange,提问作者Coding_Nubie
相关产品推荐
相关产品推荐

