一周学会Pandas2之Python数据处理与分析-Pandas2数据分组与聚合

锋哥原创的Pandas2 Python数据处理与分析 视频教程:  

2025版 Pandas2 Python数据处理与分析 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili

Pandas 的分组与聚合功能是数据分析的核心工具,允许你根据特定条件分割数据,然后对每个子集应用计算函数。下面我将全面介绍相关知识点和方法:

核心概念

  1. 分组 (Grouping):根据一个或多个键(可以是列名、函数、数组等)将数据分割为多个子集

  2. 聚合 (Aggregation):对每个分组应用计算函数(如 sum, mean, count)

  3. 转换 (Transformation):对每个分组执行操作,返回与原始数据相同形状的结果

  4. 过滤 (Filtration):根据分组统计信息筛选数据子集

groupby()分组方法

pandasgroupby() 方法是数据处理中的核心功能,用于按指定条件分组数据,再对每个组执行聚合、转换或过滤操作。以下是详细解析:

基础语法:

grouped = df.groupby(by=None, axis=0, level=None, as_index=True, sort=True)
  • by: 分组依据(列名、函数、字典、Series等)

  • axis: 0 按行分组(默认),1 按列分组

  • as_index: 是否将分组列作为结果索引(默认 True

  • sort: 是否对分组键排序(默认 True

分组依据的常见形式

1, 按单列分组

grouped = df.groupby('Category')

2,按多列分组

grouped = df.groupby(['Year', 'Month'])

3,按函数分组

# 按姓名长度分组
grouped = df.groupby(lambda x: len(df.loc[x, 'Name']))

4,按字典/Series映射分组

mapping = {'A': 'Group1', 'B': 'Group1', 'C': 'Group2'}
grouped = df.groupby(mapping)

常用操作类型

1,聚合(Aggregation):返回每组汇总结果

# 单列聚合
result = grouped['Price'].sum()
​
# 多列多函数聚合
result = grouped.agg({
    'Price': ['sum', 'mean'],
    'Quantity': 'max'
})

常用聚合函数:sum(), mean(), max(), min(), count(), std(), var(), describe()

2,转换(Transformation):返回与原始数据相同大小的结果

# 计算每组的Z-Score
zscore = lambda x: (x - x.mean()) / x.std()
df['Z-Score'] = grouped['Price'].transform(zscore)

3,过滤(Filtration):按条件筛选组

# 保留销售额>1000的组
filtered = grouped.filter(lambda g: g['Sales'].sum() > 1000)

示例:

import pandas as pd
​
data = {
    'Category': ['A', 'B', 'A', 'C', 'B', 'C'],
    'Price': [100, 150, 200, 50, 300, 250],
    'Quantity': [3, 2, 5, 4, 1, 2]
}
df = pd.DataFrame(data)
​
# 分组并计算平均价格和总销量
result = df.groupby('Category').agg(
    Avg_Price=('Price', 'mean'),
    Total_Quantity=('Quantity', 'sum')
)
​
print(result)

agg()聚合方法

前面已经介绍过。

transform()转换方法

前面已经介绍过。

GroupBy 的 filter() - 基于分组条件筛选

基本语法:

DataFrameGroupBy.filter(func, dropna=True, *args, **kwargs)

参数说明:

参数说明
func自定义函数,接收分组对象,返回布尔值表示是否保留该组
dropna是否删除结果中的 NaN 值(默认为 True)

使用场景:

  • 筛选出满足特定条件的分组(如:组内数据量大于阈值)

  • 保留符合统计条件的组(如:组平均值大于某值)

  • 基于分组特征进行数据清洗

使用实例:

import pandas as pd
​
# 创建示例数据
sales_data = {
    'Region': ['East', 'West', 'East', 'West', 'East', 'West'],
    'Salesperson': ['Alice', 'Bob', 'Charlie', 'David', 'Eva', 'Frank'],
    'Sales': [1200, 800, 1500, 900, 1300, 700]
}
df = pd.DataFrame(sales_data)
​
# 按地区分组
grouped = df.groupby('Region')
​
​
# 筛选出总销售额超过 3000 的地区
def total_sales_filter(group):
    return group['Sales'].sum() > 3000
​
​
filtered_df = grouped.filter(total_sales_filter)

常用筛选条件

# 保留组内元素超过2个的分组
df.groupby('Region').filter(lambda x: len(x) > 2)
​
# 保留平均销售额大于1000的组
df.groupby('Region').filter(lambda x: x['Sales'].mean() > 1000)
​
# 保留有销售冠军(单人销售额>1400)的组
df.groupby('Region').filter(lambda x: x['Sales'].max() > 1400)

复杂条件筛选

# 保留销售额标准差小于200的稳定销售区域
df.groupby('Region').filter(lambda g: g['Sales'].std() < 200)
​
# 保留所有销售员都超过800销售额的区域
df.groupby('Region').filter(lambda g: (g['Sales'] > 800).all())

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值