目录
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