经常会遇见对某个字段进行分组、统计等,其中还包括一些比较细致的问题,有时往往会忘记,这里做个记录。
sql的分组分为两类函数,一类是直接group by,另一类就是窗口函数进行聚合。
(1) 使用分组函数的注意事项:
自动忽略NULL值
,即在计算时不会将NULL值计入。筛选分组,应使用HAVING子句
。可以嵌套使用
,即在一个分组函数的计算结果上再进行分组。相关行集(即“窗口”)
上进行计算的函数,这些行集由 OVER()
子句定义,可以基于 SQL 查询中的各种排序和分组条件
。窗口函数可以进行复杂的分析,如运行总计、移动平均、排名等。以下是一些常见的窗口函数及其用途:
(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;
(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