Python 是数据处理和分析中非常强大的工具,而 pandas
库则是 Python 数据操作的核心工具之一。pandas
提供了丰富的功能用于数据的分组和聚合操作,可以帮助用户对数据进行更加细致的分析。
一、分组和聚合的基本概念
在数据分析中,分组(Grouping)和聚合(Aggregation)是两个非常重要的概念。
-
分组(Grouping):分组是将数据集按照某一列或多列的值进行划分,将具有相同值的行放在一起,形成子集。分组操作的核心目标是将数据按某些规则划分为不同的组。
-
聚合(Aggregation):聚合是在分组的基础上对各个组中的数据进行某种计算,例如求和、平均、计数等,从而得到一个代表性的数据值。聚合操作常用于对各个组的概览统计。
二、使用 pandas
进行分组和聚合操作
pandas
库提供了非常强大的 groupby
函数来执行分组操作,并结合其他聚合函数来进行数据的聚合分析。
1. groupby
函数的基本用法
pandas
的 groupby
方法用于将数据集按照某些特定的列进行分组。groupby
的基本语法如下:
DataFrame.groupby(by=None, axis=0, level=None, as_index=True, sort=True, group_keys=True, squeeze=NoDefault.no_default, observed=False, dropna=True)
by
:分组的键,可以是列标签、列表或字典。axis
:指定分组的轴,默认是0
即按行分组。level
:用于层级索引(MultiIndex)的分组。as_index
:默认情况下,分组键作为索引。如果设置为False
,分组键不会成为索引。sort
:默认为True
,对分组后的结果排序。group_keys
:默认为True
,在结果中包含分组键。squeeze
:如果可能,减少维度。observed
:适用于分类数据,如果为True
,仅返回出现过的分类组合。dropna
:默认为True
,从结果中排除NaN
值。
例如,有如下数据集:
import pandas as pd
data = {
'Department': ['HR', 'Finance', 'HR', 'Finance', 'IT', 'HR', 'IT', 'Finance'],
'Employee': ['Alice', 'Bob', 'Charlie', 'David', 'Eve', 'Frank', 'Grace', 'Heidi'],
'Salary': [70000, 80000, 60000, 120000, 95000, 62000, 98000, 115000]
}
df = pd.DataFrame(data)
通过 groupby
按照部门进行分组:
grouped = df.groupby('Department')
此时 grouped
对象并不会直接输出数据,而是一个 GroupBy
对象,可以通过对其进行进一步操作来查看分组后的数据。
2. 查看分组后的数据
要查看分组后的数据,可以遍历 GroupBy
对象或者使用 get_group
方法:
for name, group in grouped:
print(name)
print(group)
或者获取特定组的数据:
hr_group = grouped.get_group('HR')
print(hr_group)
3. 聚合操作
groupby
分组后的常见聚合操作包括求和、均值、计数等,常用的聚合方法包括 sum()
、mean()
、count()
、min()
、max()
等。
(1) sum
方法
对每个分组进行求和操作:
salary_sum = grouped['Salary'].sum()
print(salary_sum)
(2) mean
方法
对每个分组计算平均值:
salary_mean = grouped['Salary'].mean()
print(salary_mean)
(3) count
方法
对每个分组计数:
count = grouped['Employee'].count()
print(count)
(4) min
和 max
方法
计算每个分组中的最小值和最大值:
min_salary = grouped['Salary'].min()
max_salary = grouped['Salary'].max()
print(min_salary)
print(max_salary)
4. 多列分组
groupby
函数还支持多列分组,即同时基于多个键进行分组。
multi_grouped = df.groupby(['Department', 'Salary'])
此时的分组会更加细致,例如按部门和薪资组合来分组。
5. 使用 agg
方法进行自定义聚合
pandas
提供了 agg
方法,可以对不同的列应用不同的聚合函数,甚至可以对同一列应用多个聚合函数。
agg_result = grouped['Salary'].agg(['sum', 'mean', 'max'])
print(agg_result)
你还可以对不同的列应用不同的聚合函数:
agg_result = grouped.agg({
'Salary': 'mean',
'Employee': 'count'
})
print(agg_result)
6. 分组后的高级操作
除了常见的聚合操作,pandas
还支持一些高级的分组操作,例如:
(1) transform
方法
transform
方法用于对分组数据进行转换,返回的结果与原数据集的大小相同,但经过了某种转换操作。transform
通常用于计算归一化值、标准化值等。
df['Salary_mean'] = grouped['Salary'].transform('mean')
print(df)
(2) apply
方法
apply
方法允许对分组后的数据应用任意函数,这是 pandas
中非常灵活和强大的操作。apply
可以返回标量、Series 或 DataFrame。
例如:
def top_salary(group):
return group.nlargest(1, 'Salary')
top_salaries = grouped.apply(top_salary)
print(top_salaries)
(3) filter
方法
filter
方法用于筛选符合某些条件的分组,只有满足条件的分组会被保留。
例如,筛选出平均薪资大于 80000 的部门:
filtered = grouped.filter(lambda x: x['Salary'].mean() > 80000)
print(filtered)
三、分组和聚合操作的实战案例
为了更好地理解这些操作,我们来看一个实际的数据分析案例。
假设我们有一个包含销售数据的数据集:
sales_data = {
'Region': ['North', 'South', 'North', 'East', 'West', 'South', 'East', 'West', 'North', 'East'],
'SalesPerson': ['John', 'Alice', 'Peter', 'John', 'Alice', 'Peter', 'John', 'Alice', 'Peter', 'John'],
'Sales': [2500, 3000, 2000, 4000, 5000, 2300, 3400, 3600, 1800, 2200]
}
df_sales = pd.DataFrame(sales_data)
1. 按区域进行分组,并计算每个区域的总销售额:
region_sales = df_sales.groupby('Region')['Sales'].sum()
print(region_sales)
2. 计算每个区域的销售人数:
region_sales_count = df_sales.groupby('Region')['SalesPerson'].nunique()
print(region_sales_count)
3. 计算每个销售人员在各自区域的平均销售额:
sales_person_avg = df_sales.groupby(['Region', 'SalesPerson'])['Sales'].mean()
print(sales_person_avg)
4. 识别每个区域的最高销售额:
max_sales_per_region = df_sales.groupby('Region')['Sales'].max()
print(max_sales_per_region)
5. 结合多个聚合操作,计算每个区域的总销售额、平均销售额和最高销售额:
combined_agg = df_sales.groupby('Region')['Sales'].agg(['sum', 'mean', 'max'])
print(combined_agg)
在数据分析过程中,分组和聚合是不可或缺的操作,pandas
库为我们提供了强大的工具来实现这些操作。能够熟练掌握如何使用 groupby
进行数据分组,并结合多种聚合函数对数据进行深入分析。
可以在分组后使用各种聚合方法,如 sum
、mean
、count
等,或是利用 agg
、transform
和 apply
进行自定义的聚合操作。这些方法使得 pandas
在处理复杂数据时显得得心应手。