Pandas DataFrame: groupby agg的使用

Pandas分组聚合实战
本文介绍Pandas中数据分组与聚合的基本操作,包括构建样例数据集、使用常见及自定义聚合函数、匿名函数处理、transform与apply的应用等。通过实例演示如何灵活运用这些功能来处理数据。

@创建于:2022.07.01
@修改于:2022.07.01,2022.07.09

1、构建样例数据(无Null值和有Null值)

import pandas as pd
import numpy as np
df = pd.DataFrame({'books':['book_1', 'book_2', 'book_2', 'book_1', 'book_2', 'book_3'],
                   'price':[10, 20, 30, 30, 20, 10],
                   'num':[4, 6, 2, 4, 2, 8]})
df

    books 	price 	num
0 	book_1 	10 	4
1 	book_2 	20 	6
2 	book_2 	30 	2
3 	book_1 	30 	4
4 	book_2 	20 	2
5 	book_3 	10 	8
df2 = pd.DataFrame({'books':['book_1', 'book_1', 'book_2', 'book_2', 'book_2', 'book_3', 'book_4'],
                   'price':[10, 20, 10, 30, None,10, np.NaN],
                   'num':[2, 4, np.NaN, 2, 4, 8, 2]})
df2


	books 	price 	num
0 	book_1 	10.0 	2.0
1 	book_1 	20.0 	4.0
2 	book_2 	10.0 	NaN
3 	book_2 	30.0 	2.0
4 	book_2 	NaN 	4.0
5 	book_3 	10.0 	8.0
6 	book_4 	NaN 	2.0

2、agg常见聚合函数

在这里插入图片描述

f_agg = ['max','mean', 'sum']
df.groupby('books')['price', 'num'].agg(func=f_agg)

在这里插入图片描述

3、agg匿名聚合函数

# 可以使用匿名聚合函数
# 可以使用as_index=False是的分组字段不作为行索引
df.groupby('books', as_index=False)['price', 'num'].agg(lambda x: x.eq(10).sum())

 	  books 	price 	num
0 	book_1 	1 	0
1 	book_2 	0 	0
2 	book_3 	1 	0
# 当agg中的聚合函数多于1个的时候,as_index失效
df.groupby('books', as_index=False)['price'].agg([lambda x: x.eq(10).sum(), 'mean']).rename({'<lambda_0>':'eq10'}, axis=1)

 	   eq10 	mean
books 		
book_1 	1 	20.000000
book_2 	0 	23.333333
book_3 	1 	10.000000
f_agg = ['max', lambda x: x.eq(10).sum(), 'mean', lambda x: x.isna().sum()]
df.groupby('books')['price'].agg(func=f_agg).rename({'<lambda_0>':'eq10'}, axis=1)


       max 	eq10 	mean 	<lambda_1>
books 				
book_1 	30 	1 	20.000000 	0
book_2 	30 	0 	23.333333 	0
book_3 	10 	1 	10.000000 	0

4、agg内的自定义方法

df2 = pd.DataFrame({'books':['book_1', 'book_1', 'book_2', 'book_2', 'book_2', 'book_3', 'book_4'],
                   'price':[10, 20, 10, 30, None,10, np.NaN],
                   'num':[2, 4, np.NaN, 2, 4, 8, 2]})
                   
def q25(x):
    return x.quantile(0.25)
def q50(x):
    return x.quantile(0.50)
def q75(x):
    return x.quantile(0.75)

df2.groupby('books')['num'].agg(['mean', 'max', 'median', q25,q50, q75])


 	mean 	max 	median 	q25 	q50 	q75
books 						
book_1 	3.0 	4.0 	3.0 	2.5 	3.0 	3.5
book_2 	3.0 	4.0 	3.0 	2.5 	3.0 	3.5
book_3 	8.0 	8.0 	8.0 	8.0 	8.0 	8.0
book_4 	2.0 	2.0 	2.0 	2.0 	2.0 	2.0

在这里插入图片描述

参考链接:Pandas groupby quantile values

5、transform应用

df2.groupby('books').transform(lambda x: x.fillna(x.mean()))

# 没有了books这一列
	price 	num
0 	10.0 	2.0
1 	20.0 	4.0
2 	10.0 	3.0
3 	30.0 	2.0
4 	20.0 	4.0
5 	10.0 	8.0
6 	NaN 	2.0

6、apply应用

df2.groupby('books').apply(lambda x: x.fillna(x.mean()))

在这里插入图片描述

dft = df2.groupby('books').apply(lambda x: x.fillna(x.mean()))
dft.index = dft.index.droplevel(0)
dft

在这里插入图片描述

df2.groupby('books').transform(lambda x: x/x.max())
df2.groupby('books').apply(lambda x: x/x.max())

# 二者的结果是一致的,都没有books字段
 	price 	num
0 	0.500000 	0.5
1 	1.000000 	1.0
2 	0.333333 	NaN
3 	1.000000 	0.5
4 	NaN 	1.0
5 	1.000000 	1.0
6 	NaN 	1.0

7、参考链接

Pandas教程 | 超好用的Groupby用法详解
DataFrame进行数据分组运算并筛选指定条件的group
Pandas groupby quantile values

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值