Pandas的groupby分组统计两个技巧

1、怎样给每行数据,添加该分组的平均值

例如,对于员工的数据,包括员工ID、部门名称、薪资,怎么给每行数据,添加所属部门的平均薪资

import pandas as pd

# 创建示例数据
data = {
    'EmployeeID': [1, 2, 3, 4, 5],
    'Department': ['HR', 'IT', 'HR', 'IT', 'Finance'],
    'Salary': [50000, 60000, 52000, 62000, 70000]
}

df = pd.DataFrame(data)

# 自定义函数,添加部门平均薪资列
def add_department_avg_salary(group):
    group['DepartmentAvgSalary'] = group['Salary'].mean()
    return group

# 使用groupby和apply添加部门平均薪资
df = df.groupby('Department').apply(add_department_avg_salary)

print(df)

定义自定义函数:
定义一个自定义函数 add_department_avg_salary,该函数接受一个分组的数据框,并计算该分组的平均薪资,将其添加为新列。

使用groupby和apply:
使用 groupby 按部门对数据进行分组,然后使用 apply 将自定义函数应用到每个分组。

2、groupby怎样计算每个部门薪资最高的3个员工

import pandas as pd

# 创建示例数据
data = {
    'EmployeeID': [1, 2, 3, 4, 5, 6, 7],
    'Department': ['HR', 'IT', 'HR', 'IT', 'Finance', 'IT', 'HR'],
    'Salary': [50000, 60000, 52000, 62000, 70000, 61000, 53000]
}

df = pd.DataFrame(data)

# 自定义函数,获取每个部门最高薪资的前三个人的信息
def top_n_salaries(group, n=3):
    return group.nlargest(n, 'Salary')

# 使用groupby和apply计算每个部门最高薪资的前三个人的信息
top_salaries = df.groupby('Department').apply(top_n_salaries).reset_index(drop=True)

print(top_salaries)

对于nlargest函数的解释:

nlargest 函数是 pandas 中用来从数据框或 Series 中选取具有最大值的前 n 个元素的函数。它可以应用于一列或多列,并且返回一个包含前 n 个最大值的子数据框或 Series。

DataFrame.nlargest(n, columns, keep='first')
Series.nlargest(n, keep='first')

n: 要返回的最大值数量。
columns: 要根据哪些列选取最大值(仅适用于 DataFrame)。
keep: 保留重复值的方式。默认值为 'first',表示保留前 n 个出现的最大值。可以选择:
'first': 保留前 n 个出现的最大值。
'last': 保留最后 n 个出现的最大值。
'all': 保留所有出现的最大值,如果存在重复值,返回的结果可能会多于 n 个。

3、pandas的groupby分组统计,基于groupby的agg和apply,这俩函数有什么区别

agg(aggregate):

  • agg 函数用于对分组后的数据进行聚合操作。它通常用于需要对每个分组应用多种聚合函数的情况。

  • agg 接受一个字符串、函数或函数列表作为参数,并对每个分组的数据进行聚合操作。

  • 可以传入单个聚合函数,例如:mean、sum、max、min 等。

  • 可以传入多个聚合函数,形成一个字典,指定不同列使用不同的聚合函数。

示例:

import pandas as pd

# 创建示例数据
df = pd.DataFrame({
    'A': ['foo', 'foo', 'bar', 'bar'],
    'B': [1, 2, 3, 4],
    'C': [10, 20, 30, 40]
})

# groupby后使用agg进行聚合操作
result = df.groupby('A').agg({
    'B': 'sum',  # 对B列求和
    'C': 'mean'  # 对C列求平均值
})
print(result)

apply:

  • apply 函数用于对分组后的数据应用自定义函数。与 agg 不同,apply 允许你对每个分组的数据应用更复杂的操作,并返回任意形状的数据。apply 更灵活,但也可能较慢。

可以传入一个自定义函数,对每个分组的数据进行任意操作。

import pandas as pd

# 创建示例数据
df = pd.DataFrame({
    'A': ['foo', 'foo', 'bar', 'bar'],
    'B': [1, 2, 3, 4],
    'C': [10, 20, 30, 40]
})

# 自定义函数,对每个分组的数据进行操作
def custom_func(group):
    return group['B'].sum() + group['C'].mean()

# groupby后使用apply应用自定义函数
result = df.groupby('A').apply(custom_func)
print(result)

区别总结:

  • agg:主要用于对分组后的数据进行聚合操作,适用于需要对数据进行总结性统计的情况。
  • apply:用于对分组后的数据应用自定义操作,适用于需要更复杂的处理逻辑的情况。

Leave a Comment