锋哥原创的Pandas2 Python数据处理与分析 视频教程:
2025版 Pandas2 Python数据处理与分析 视频教程(无废话版) 玩命更新中~_哔哩哔哩_bilibili
Pandas 的分组与聚合功能是数据分析的核心工具,允许你根据特定条件分割数据,然后对每个子集应用计算函数。下面我将全面介绍相关知识点和方法:
核心概念
-
分组 (Grouping):根据一个或多个键(可以是列名、函数、数组等)将数据分割为多个子集
-
聚合 (Aggregation):对每个分组应用计算函数(如 sum, mean, count)
-
转换 (Transformation):对每个分组执行操作,返回与原始数据相同形状的结果
-
过滤 (Filtration):根据分组统计信息筛选数据子集
groupby()分组方法
pandas
的 groupby()
方法是数据处理中的核心功能,用于按指定条件分组数据,再对每个组执行聚合、转换或过滤操作。以下是详细解析:
基础语法:
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())