Python DataFrame:提取某字段最大值所对应的行

目录

解决思路:

1、我们先来定义一个DataFrame:

2、接下来,对df进行group by,并取最大值:

3、然后,我们利用第2步所得的最大值分组,与原表进行连接,提取最大值所在行:

Update list:

2022.11.07更新:对合并后的结果去重;


我们处理某些表格数据时,会遇到某个字段在不同类别中有不同的值,有时候需要提取某个类别中该字段最大值所对应的行,只用group by 往往不行。其实,使用group by merge 相结合,即可轻松解决这个问题。

解决思路:

1、我们先来定义一个DataFrame:

在上图的df中,不同的name对应着num值、年份,现在想提取每一year的最大num所对应的name。

2、接下来,对df进行group by,并取最大值:

可以看到,通过group by,我们提取出了每一year所对应的最大num。注意:我们进行group by 时,选取了原df中的两列:'year'、'num',这样做是排除name的干扰,groupby()函数中,需要指定分组依赖的列‘year’,并设定不将分组列作为索引;最后的max()是按最大值提取该分组的数据,当然其他函数如min()/mean()同样适用

3、然后,我们利用第2步所得的最大值分组,与原表进行连接,提取最大值所在行:

可以看到,对df_groupby和原表df进行左连后,成功取出了每一year最大num对应的name!

源码如下:

import pandas as pd

data = {'year':[2016,2016,2017,2017,2017,2018,2018],
        'num':[2,5,4,7,8,90,78],
        'name':['a','b','c','d','e','f','g']}

df = pd.DataFrame(data)

df_groupby = df[['year','num']].groupby(by='year',as_index=False).max()

df_merge = pd.merge(df_groupby,df,on=['year','num'],how='left')

评论区有小伙伴提出数据存在重复时,在合并后的结果条数不对。其实这个只需要做一步去重即可,可以对最后的合并结果去重,也可以在一开始对原始的DataFrame去重 。下面给出存在重复记录的情况下,在合并步骤之后进行去重的示例:

首先,不去重的代码如下:

import pandas as pd

data = {'year': [2016, 2016, 2017, 2017, 2017, 2018, 2018],
        'num': [2, 2, 4, 7, 8, 90, 78],
        'name': ['a', 'a', 'c', 'd', 'e', 'f', 'g']}

df = pd.DataFrame(data)

df_groupby = df[['year', 'num']].groupby(by='year', as_index=False).max()

df_merge = pd.merge(df_groupby, df, on=['year', 'num'], how='left')

结果为:

   year  num name
0  2016    2    a
1  2016    2    a
2  2017    8    e
3  2018   90    f

在最后增加一个去重步骤:

result = df_merge.drop_duplicates()

最终结果为:

   year  num name
0  2016    2    a
2  2017    8    e
3  2018   90    f

  • 25
    点赞
  • 92
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 8
    评论
评论 8
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

AICVHub

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值