表: Employee
+--------------+---------+ | 列名 | 类型 | +--------------+---------+ | id | int | | name | varchar | | salary | int | | departmentId | int | +--------------+---------+ 在 SQL 中,id是此表的主键。 departmentId 是 Department 表中 id 的外键(在 Pandas 中称为 join key)。 此表的每一行都表示员工的 id、姓名和工资。它还包含他们所在部门的 id。
表: Department
+-------------+---------+ | 列名 | 类型 | +-------------+---------+ | id | int | | name | varchar | +-------------+---------+ 在 SQL 中,id 是此表的主键列。 此表的每一行都表示一个部门的 id 及其名称。
查找出每个部门中薪资最高的员工。
按 任意顺序 返回结果表。
解题思路:
1.将两张表进行关联
2.分组,找出每个部门的最大值
3.改列名
# 两张表进行关联
df = pd.merge(left = employee, right = department, left_on = 'departmentId', right_on = 'id', how = 'inner')
# 根据departmentId进行分组
df_g = df.groupby('departmentId')
# 选取每个组的salary最大值,得到的是一个series
df_salary = df_g['salary'].transform('max')
# 将原始结合表中salary值等于每个组的最大值的筛选出来
df_salary_max = df[df['salary'] == df_salary]
# 筛选列并改名称
df_salary_max = df_salary_max[['name_y', 'name_x', 'salary']].rename(columns={'name_y':'Department', 'name_x':'Employee', 'salary':'Salary'})
# transform的详细解释:
transform() 是 Pandas 中的一个函数,它用于对指定的数据进行转换或操作,并返回与原始输入数据具有相同索引的结果。
transform() 函数通常与 groupby() 结合使用。当我们想要将一些聚合计算的结果(如均值、总和、最大值等)应用到每个组的所有元素上时,可以使用 transform() 函数。
下面是 transform() 函数的详细解释:
语法:
python
DataFrame.transform(func, axis=0, *args, **kwargs)
参数:
func:要应用于每个组的转换函数。
axis:指定沿着行轴(0)还是列轴(1)应用转换,默认为 0。
*args 和 **kwargs:可选的附加参数,传递给 func 函数。
返回值:
与原始输入具有相同索引的数据。
使用 transform() 函数的主要特点是,它会对每个组内的所有元素进行转换,并根据原始数据的索引将转换结果放置在相应的位置上。这与 agg() 或 apply() 函数不同,后者们只返回聚合计算的结果而不保留原始数据的结构。
以下是一个示例代码,演示如何使用 transform() 函数计算每个组的均值并将结果分配给每个元素:
python
import pandas as pd
# 创建示例数据框
data = {'Group': ['A', 'A', 'B', 'B', 'B'],
'Value': [1, 2, 3, 4, 5]}
df = pd.DataFrame(data)
# 使用 transform() 计算每个组的均值并分配给每个元素
df['Mean'] = df.groupby('Group')['Value'].transform('mean')
print(df)
输出结果:
Group Value Mean
0 A 1 1.5
1 A 2 1.5
2 B 3 4.0
3 B 4 4.0
4 B 5 4.0
在上面的示例中,我们使用 transform() 函数计算了每个组的均值,并将结果赋给了新的列 'Mean'。可以看到,均值被正确地分配给了每个元素,并且保留了原始数据的结构。
transform() 函数在进行逐组计算时非常有用,尤其是当你希望将聚合结果与原始数据的相应元素相关联时。