按分组列求和值

Posted

技术标签:

【中文标题】按分组列求和值【英文标题】:Sum Values by Grouped Column 【发布时间】:2020-10-07 08:58:00 【问题描述】:

我已经非常接近于弄清楚如何按照我想要的方式对我的数据框进行排序,我只是不知道是否有更简洁的方法来做到这一点。

假设我的数据框定义为-

dic = 'firstname':['John','John','John','John','John','Susan','Susan',
                    'Susan','Susan','Susan','Mike','Mike','Mike','Mike',
                    'Mike'],
       'lastname':['Smith','Smith','Smith','Smith','Smith','Wilson',
                   'Wilson','Wilson','Wilson','Wilson','Jones','Jones',
                   'Jones','Jones','Jones'],
       'company':['KFC','BK','KFC','KFC','KFC','BK','BK','WND','WND',
                  'WND','TB','CHP','TB','CHP','TB'],
       'paid':[200,300,250,100,900,650,430,218,946,789,305,750,140,860,310],
       'overtime':[205,554,840,100,203,640,978,451,356,779,650,950,230,250,980]
df = pd.DataFrame(dic)
print(df)

带输出-

   firstname lastname company  paid  overtime
0       John    Smith     KFC   200       205
1       John    Smith      BK   300       554
2       John    Smith     KFC   250       840
3       John    Smith     KFC   100       100
4       John    Smith     KFC   900       203
5      Susan   Wilson      BK   650       640
6      Susan   Wilson      BK   430       978
7      Susan   Wilson     WND   218       451
8      Susan   Wilson     WND   946       356
9      Susan   Wilson     WND   789       779
10      Mike    Jones      TB   305       650
11      Mike    Jones     CHP   750       950
12      Mike    Jones      TB   140       230
13      Mike    Jones     CHP   860       250
14      Mike    Jones      TB   310       980

我的目标是查明是否有人在一家公司的收入超过 1,300,不包括加班费(所以只是付费栏)

这是我尝试过的-

df = df.groupby(['lastname', 'firstname','company']).sum()
s = df['paid']>1300
df['limit']=s
df = df.loc[df['limit']==True]
del df['limit']
df = df.sort_values(by=['paid'],ascending=False)
print(df)

有输出结果-

                            paid  overtime
lastname firstname company                
Wilson   Susan     WND      1953      1586
Jones    Mike      CHP      1610      1200
Smith    John      KFC      1450      1348

我正在寻求帮助以清理我的工作,但也有一些问题。

为什么带薪和加班的输出栏是加了一个?我可以把它调回去吗? 另外,我只想对付费栏求和,没有其他的(如果加班栏没有出现在最终输出中也可以)

这正是我想要的-

lastname firstname company paid              
Wilson   Susan     WND     1953
Jones    Mike      CHP     1610
Smith    John      KFC     1450

【问题讨论】:

您可以通过这样做df.sort_values(by=['paid'],ascending=False).reset_index() 更改已付和加班列的高度,您也可以组合您的一些步骤df[df['paid']>1300].sort_values(by=['paid'],ascending=False) 将为您提供最终数据集。你做的方式很好,你的更具可读性 【参考方案1】:

更改这一行,使用as_index=Falseagg

df = df.groupby(['lastname', 'firstname','company'], as_index=False).agg('paid': 'sum')

  lastname firstname company  paid
5   Wilson     Susan     WND  1953
0    Jones      Mike     CHP  1610
3    Smith      John     KFC  1450

【讨论】:

以上是关于按分组列求和值的主要内容,如果未能解决你的问题,请参考以下文章

Oracle - 按多维数据集分组 - 按不同列求和

SQL Server:按分组列求和并按另一列排序

如何对按客户分组的多列和多行求和

按周分组和求和

mongodb 分组统计: 按deviceId、tenant分组,统计总记录条数、求和workload

如何在golang中按多个值分组并对多个值求和