Python与Django实现分组求和及累加求和详解
本文详细介绍如何在Python中使用Pandas进行分组求和与分组累加求和,涵盖groupby、count、cumsum及merge等关键操作。同时解析Django中利用aggregate与annotate函数对数据库字段进行条件求和的正确姿势,对比两种实现方式的输出差异,帮助开发者准确获取统计结果。
Python Pandas分组求和与累加实现
为了节省篇幅,这里直接展示核心代码实现。
# -*- encoding=utf-8 -*-
import pandas as pd
data=['abc','abc','abc','asc','ase','ase','ase']
num=[1,2,2,1,2,1,2]
df1=pd.DataFrame({'name':data,'num':num})
print(df1)
df1['mmm']=df1['num']
df2=df1.groupby(['name', 'num'], as_index=False).count()
print(df2)
df2.sort_values(['name', 'num'], ascending=[1, 1], inplace=True)
print(df2)
df2['sum']=df2.groupby(['name'])['mmm'].cumsum()
print(df2)
kk=df2.groupby(['name'],as_index=False)['num'].sum()
print(kk)
df3 = pd.merge(df2, kk, on='name', how='left',)
print(df3)
df3['ratio']=df3['sum']/df3['num_y']
df3.columns = ['name', 'num', 'mmm', 'sum','numsum','ratio']
print(df3)
df4=df3.groupby(['mmm'],as_index=False)['ratio'].mean()
print(df4)
执行上述代码后的运行效果如下:
name num
0 abc 1
1 abc 2
2 abc 2
3 asc 1
4 ase 2
5 ase 1
6 ase 2
name num mmm
0 abc 1 1
1 abc 2 2
2 asc 1 1
3 ase 1 1
4 ase 2 2
name num mmm
0 abc 1 1
1 abc 2 2
2 asc 1 1
3 ase 1 1
4 ase 2 2
name num mmm sum
0 abc 1 1 1
1 abc 2 2 3
2 asc 1 1 1
3 ase 1 1 1
4 ase 2 2 3
name num
0 abc 3
1 asc 1
2 ase 3
name num_x mmm sum num_y
0 abc 1 1 1 3
1 abc 2 2 3 3
2 asc 1 1 1 1
3 ase 1 1 1 3
4 ase 2 2 3 3
name num mmm sum numsum ratio
0 abc 1 1 1 3 0.333333
1 abc 2 2 3 3 1.000000
2 asc 1 1 1 1 1.000000
3 ase 1 1 1 3 0.333333
4 ase 2 2 3 3 1.000000
mmm ratio
0 1 0.555556
1 2 1.000000
Process finished with exit code 0
Django聚合函数Sum的使用与对比
补充知识:在Python项目中,针对满足特定条件的字段进行求和,通常涉及聚合函数annotate()与aggregate()的应用。
针对满足特定条件的字段执行求和操作。
具体需求是计算每日的收入总和。
1、
new_dayincome = request.POST.get("dayincome_time", None)
# total_income = models.bathAccount.objects.filter(dayBath=new_dayincome).aggregate(nums=Sum('priceBath'))
total_income = models.bathAccount.objects.values('priceBath').annotate(nums=Sum('priceBath')).filter(dayBath=new_dayincome)
print("total_income",total_income[0]['nums'])
输出结果显示:total_income 为 132。
2、
from django.db.models import Sum,Count
new_dayincome = request.POST.get("dayincome_time", None)
total_income = models.bathAccount.objects.filter(dayBath=new_dayincome).aggregate(nums=Sum('priceBath'))
print("total_income",total_income['nums'])
输出结果显示:total_income 为 572。
第二种方式输出的数值才是正确的结果。
以上关于Python实现分组求和与分组累加求和的代码示例就是本文分享的全部内容,希望能为读者提供参考,也欢迎大家继续支持本站。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









