问题描述
Employees 表:
列名 | 类型 | employee_id | int | name | varchar | salary | int | employee_id 是这个表的主键(具有唯一值的列)。
此表的每一行给出了雇员id ,名字和薪水。
任务:
编写解决方案,计算每个雇员的奖金。如果一个雇员的 id 是 奇数 并且他的名字不是以 'M' 开头,那么他的奖金是他工资的 100% ,否则奖金为 0 。
返回的结果按照 employee_id 排序。
示例 1:
输入:
Employees 表:
employee_id | name | salary | 2 | Meir | 3000 | 3 | Michael | 3800 | 7 | Addilyn | 7400 | 8 | Juan | 6100 | 9 | Kannon | 7700 | 输出:
employee_id | bonus | 2 | 0 | 3 | 0 | 7 | 7400 | 8 | 0 | 9 | 7700 | 解释:
因为雇员id是偶数,所以雇员id 是2和8的两个雇员得到的奖金是0。
雇员id为3的因为他的名字以'M'开头,所以,奖金是0。
其他的雇员得到了百分之百的奖金。
创建数据集
# 创建Employees表的DataFrame
employees_data = {
'employee_id': [2, 3, 7, 8, 9],
'name': ["Meir", "Michael", "Addilyn", "Juan", "Kannon"],
'salary': [3000, 3800, 7400, 6100, 7700]
}
employees_df = pd.DataFrame(employees_data)
employees_dfemployee_id | name | salary | 0 | 2 | Meir | 3000 | 1 | 3 | Michael | 3800 | 2 | 7 | Addilyn | 7400 | 3 | 8 | Juan | 6100 | 4 | 9 | Kannon | 7700 | 解答
# 方法1:使用apply()函数和条件判断
def calculate_bonus(row):
if row['employee_id'] % 2 == 1 and not row['name'].startswith('M'):
return row['salary']
else:
return 0
employees_df['bonus'] = employees_df.apply(calculate_bonus, axis=1)
result_1 = employees_df[['employee_id', 'bonus']].sort_values(by='employee_id')
result_1employee_id | bonus | 0 | 2 | 0 | 1 | 3 | 0 | 2 | 7 | 7400 | 3 | 8 | 0 | 4 | 9 | 7700 | # 方法2:使用条件索引和np.where()
import numpy as np
condition = (employees_df['employee_id'] % 2 == 1) & (~employees_df['name'].str.startswith('M'))
employees_df['bonus'] = np.where(condition, employees_df['salary'], 0)
result_2 = employees_df[['employee_id', 'bonus']].sort_values(by='employee_id')
result_2employee_id | bonus | 0 | 2 | 0 | 1 | 3 | 0 | 2 | 7 | 7400 | 3 | 8 | 0 | 4 | 9 | 7700 | 知识点
以下是上述答案所涉及到的pandas知识点:
(1)使用 apply() 函数:用于对DataFrame或Series的每个元素执行特定的函数。在此,我们使用它来根据条件判断计算奖金。
(2)条件索引:使用布尔表达式(如 employees_df['employee_id'] % 2 == 1)对DataFrame进行过滤,得到满足条件的行。
(3)str.startswith() 函数:这是一个专门用于检查DataFrame或Series中的字符串是否以给定的子串开头的函数。
(4)使用 np.where() 函数:
- np.where() 函数用于基于条件返回两个可选值之一。在这种情况下,我们使用它来返回薪水值或 0,具体取决于给定的条件是否为真。
(5)选择DataFrame的列:使用双方括号 (例如 [['employee_id', 'bonus']]) 从DataFrame中选择多列。
如有其他解法或者问题,欢迎留言或私信~ |