数据: op1 = pd.DataFrame({ 'subject_id':[1,1,1,1,1,1,1,1,1,2,2,2,2,2,2,2,2,2], 'date' : ['1/1/2017','1/1/2017','1/1/2017','1/2/2017','1/2/2017','1/2/2017','1/3/2017','1/3/2017','1/3/2017','1/4/2017','1/4/2017','1/4/2017','1/5/2017','1/5/2017','1/5/2017', '1/6/2017','1/6/2017','1/6/2017'], 'val' :[5,5,11,10,5,7,16,12,11,21,23,26,6,8,5,11,10,3] })
我想要做的是每天为每一科获取最小值和最大值。
虽然我的代码在下面,但我觉得可以用更好的方式来编写它。
t1 = op1.groupby(['subject_id','date'])['val'].max().reset_index()
t2 = op1.groupby(['subject_id','date'])['val'].min().reset_index()
t1.merge(t2,on=['subject_id','date'],how='inner',suffixes=('_max', '_min'))
对新的列名和聚合函数使用GroupBy.agg和元组:
df = (op1.groupby(['subject_id','date'])['val'] .agg([('val_max', 'max'),('val_min', 'min')]) .reset_index())
print (df)
subject_id date val_max val_min
0 1 1/1/2017 11 5
1 1 1/2/2017 10 5
2 1 1/3/2017 16 11
3 2 1/4/2017 26 21
4 2 1/5/2017 8 5
在pandas 0.25+可以使用named aggregation:
df = (op1.groupby(['subject_id','date']) .agg(val_min=pd.NamedAgg(column='val', aggfunc='min'), val_max=pd.NamedAgg(column='val', aggfunc='max')) .reset_index())
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。