Python 进行数据的分组和聚合操作

Python 是数据处理和分析中非常强大的工具,而 pandas 库则是 Python 数据操作的核心工具之一。pandas 提供了丰富的功能用于数据的分组和聚合操作,可以帮助用户对数据进行更加细致的分析。

一、分组和聚合的基本概念

在数据分析中,分组(Grouping)和聚合(Aggregation)是两个非常重要的概念。

  • 分组(Grouping):分组是将数据集按照某一列或多列的值进行划分,将具有相同值的行放在一起,形成子集。分组操作的核心目标是将数据按某些规则划分为不同的组。

  • 聚合(Aggregation):聚合是在分组的基础上对各个组中的数据进行某种计算,例如求和、平均、计数等,从而得到一个代表性的数据值。聚合操作常用于对各个组的概览统计。

二、使用 pandas 进行分组和聚合操作

pandas 库提供了非常强大的 groupby 函数来执行分组操作,并结合其他聚合函数来进行数据的聚合分析。

1. groupby 函数的基本用法

pandasgroupby 方法用于将数据集按照某些特定的列进行分组。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) minmax 方法

计算每个分组中的最小值和最大值:

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 进行数据分组,并结合多种聚合函数对数据进行深入分析。

可以在分组后使用各种聚合方法,如 summeancount 等,或是利用 aggtransformapply 进行自定义的聚合操作。这些方法使得 pandas 在处理复杂数据时显得得心应手。

  • 18
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值