如何使用基于字符串的条件值填充列

时间:2019-04-18 09:20:59

标签: python python-3.x pandas

我有以下数据:

data = {
    'employee'  : ['Emp1', 'Emp2', 'Emp3', 'Emp4', 'Emp5'],
    'code'      : ['2018_1', '2018_3', '2019_1', '2019_2', '2017_1'],
}

old_salary_bonus = 3000

new_salary_bonus = {
    '2019_1': 1000,
    '2019_2': 980,
}

df = pd.DataFrame(data)

任务:根据以下条件添加df ['salary_bonus']列: 如果员工的代码包含“ 2019”,则使用代码值从new_salary_bonus检索薪金奖金值,否则使用old_salary_bonus值。

预期输出:

   employee  code     salary_bonus
0  Emp1      2018_1   3000
1  Emp2      2018_3   3000
2  Emp3      2019_1   1000
3  Emp4      2019_2   980
4  Emp5      2017_1   3000

请帮助。

2 个答案:

答案 0 :(得分:3)

Series.mapSeries.fillna一起用于替换不匹配的值:

import pandas as pd

data = {
    'employee'  : ['Emp1', 'Emp2', 'Emp3', 'Emp4', 'Emp5'],
    'code'      : ['2018_1', '2018_3', '2019_1', '2019_2', '2017_1'],
}

old_salary_bonus = 3000

new_salary_bonus = {
    '2019_1': 1000,
    '2019_2': 980,
}

df = pd.DataFrame(data)

df['salary_bonus'] = df['code'].map(new_salary_bonus).fillna(old_salary_bonus)
print (df)
  employee    code  salary_bonus
0     Emp1  2018_1        3000.0
1     Emp2  2018_3        3000.0
2     Emp3  2019_1        1000.0
3     Emp4  2019_2         980.0
4     Emp5  2017_1        3000.0

另一个get且不匹配的默认解决方案:

df['salary_bonus'] = df['code'].map(lambda x: new_salary_bonus.get(x, old_salary_bonus))

答案 1 :(得分:0)

您可以使用以下代码:

df['salary_bonus'] = old_salary_bonus
df.loc[df['code'].isin(list(new_salary_bonus)), 'salary_bonus'] = list(new_salary_bonus.values())