分组函数应用(sql+python)总结

本文详细介绍了SQL中的分组函数(groupby和over())以及窗口函数的应用,包括它们的注意事项和常见用法。同时,展示了Python的pandas库中如何使用groupby函数进行数据分组和计算,如size(),transform(),和apply()方法的实例应用。
摘要由CSDN通过智能技术生成

经常会遇见对某个字段进行分组、统计等,其中还包括一些比较细致的问题,有时往往会忘记,这里做个记录。

1. sql的分组(group by/ over())

sql的分组分为两类函数,一类是直接group by,另一类就是窗口函数进行聚合。
(1) 使用分组函数的注意事项:

  • 分组函数会自动忽略NULL值,即在计算时不会将NULL值计入。
  • 分组函数只能在包含GROUP BY子句的SELECT语句中使用。
  • 在使用WHERE子句时不能直接使用分组函数,因为WHERE子句是在GROUPBY子句之前执行的。如果需要筛选分组,应使用HAVING子句
  • 分组函数可以嵌套使用,即在一个分组函数的计算结果上再进行分组。
    (2) 窗口函数
    窗口函数是一类在相关行集(即“窗口”)上进行计算的函数,这些行集由 OVER() 子句定义,可以基于 SQL 查询中的各种排序和分组条件。窗口函数可以进行复杂的分析,如运行总计、移动平均、排名等。

以下是一些常见的窗口函数及其用途:

  • ROW_NUMBER():为窗口内的每一行分配一个唯一的序号,从1开始
  • RANK() 和 DENSE_RANK():对窗口内的行进行排名,RANK() 排名时排名之间会跳号,而 DENSE_RANK() 则不会
  • LEAD() 和 LAG():访问窗口中当前行之后的(LEAD)或之前的(LAG的行
  • SUM()、AVG()、MIN()、MAX():这些聚合函数也可以作为窗口函数使用,对窗口内的行集进行计算。
  • VARIANCE() 和 STDDEV():计算窗口内数值的方差和标准差。

(3) 窗口函数通常与OVER()子句一起使用,以便定义窗口的计算方式。OVER()子句可以包含排序订单(ORDER BY)和分页(PARTITION BY)子句。

-- 为每个区域每个月的销售总额计算一个移动的总和
SELECT region, 
date_part('month', date) as month, 
SUM(sales_amount) over (partition by region order by date) as monthly_sales
FROM sales
ORDER BY region, date;

2. PYTHON分组函数使用groupby

(1) data.groupby().size().reset_index(name='')

import pandas as pd

# 假设有一个DataFrame如下
data = pd.DataFrame({
    'A': ['a', 'a', 'b', 'b', 'a'],
    'B': ['one', 'two', 'one', 'two', 'one']
})

# 使用groupby和size方法计算每个组的大小
grouped = data.groupby('A').size().reset_index()

# 输出结果
print(grouped)

(2) transform函数

grouped=data.groupby(['pproduct_no','range']).size().reset_index(name='counts')
grouped['percentage']=grouped['counts']/grouped.groupby('product_no')['counts'].transform('sum')

.transform(‘sum’): transform方法在这里被用来对选定的列(‘counts’)中的每个分组应用一个函数。在这个例子中,函数是sum,它会计算每个分组中counts列值的和。transform方法有两个重要的特点:

  • 不会改变原始数据形状
  • 它会返回一个与原始数据相同形状的新数据,其中包含了应用了指定函数的数据。

在这个例子中,每个分组的counts列的值会被替换为该组counts列值的总和

(3) apply函数
对每个分组的数据调用某个函数

def sam_st(df,target):
	y=df[target]
	ttl_cnt=len(y)
	good_cnt=np.sum(y==0)
	bad_cnt=np.sum(y==1)
	bad_rate=bad_cnt/(good_cnt+bad_cnt)
	return pd.Series([ttl_cnt,good_cnt,bad_cnt,bad_rate],
					index=['TotalCnt','GoodCnt','BadCnt','BadRate'],
					dtype='object')
group_col=''
target=''					
data.groupby(group_col).apply(sam_st,target=target)
# sam_st里面的df代表分组之后的每个分组的数据,groupby之后就可以直接作为参数df
  • 9
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值