按分组列求和值
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=False
和agg
:
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
【讨论】:
以上是关于按分组列求和值的主要内容,如果未能解决你的问题,请参考以下文章