开发者社区> 问答> 正文

用pandas获得最小值和最大值的更好方式?

数据: 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'))

展开
收起
游客6qcs5bpxssri2 2019-10-11 16:04:44 2812 0
1 条回答
写回答
取消 提交回答
  • 对新的列名和聚合函数使用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())

    2019-10-11 16:08:56
    赞同 展开评论 打赏
问答分类:
问答标签:
问答地址:
问答排行榜
最热
最新

相关电子书

更多
中文:即学即用的Pandas入门与时间序列分析 立即下载
即学即用的Pandas入门与时间序列分析 立即下载
低代码开发师(初级)实战教程 立即下载