如何按mesano分组保留revisão列最大值对应的DataFrame行?
问题描述
我有一个DataFrame,需要只保留每个mesano列值对应的revisão列最大值所在的行。这个DataFrame包含mesano、description、paymentCategories.description、paymentCategories.type、paymentCategories.interval.totalPrice、revisão这些字段。
我试了两段代码,但都没实现需求:
groupede=dfgc.groupby(['mesano','description','paymentCategories.description','paymentCategories.type']) result=groupede['revisao','paymentCategories.interval.totalPrice'].agg('max','sum')
还有
grouped=dfgc.groupby(['mesano','description','paymentCategories.description','paymentCategories.type','paymentCategories.interval.totalPrice'], as_index=False)['revisao'].max()
解决方案
方法一:用groupby+transform筛选行
这种方式能直接保留原DataFrame的所有列,只筛出每个mesano分组里revisão最大的行:
# 先算出每个mesano分组的revisão最大值 max_revisao = dfgc.groupby('mesano')['revisão'].transform('max') # 筛选出revisão等于对应分组最大值的行 result = dfgc[dfgc['revisão'] == max_revisao]
方法二:排序后去重
先按mesano分组,再把revisão按降序排序,最后保留每个mesano的第一行(也就是最大值所在的行):
result = dfgc.sort_values(['mesano', 'revisão'], ascending=[True, False]) \ .drop_duplicates(subset='mesano', keep='first')
你的代码问题在哪?
- 第一段代码:你按多列分组,还想用
agg同时求max和sum,但这么做只会生成聚合后的统计结果,拿不到原数据行;而且agg的参数格式不对,应该用字典指定每个列的聚合方式,比如agg({'revisao':'max', 'paymentCategories.interval.totalPrice':'sum'}),但就算改了也达不到你要保留原行的需求。 - 第二段代码:分组的时候把
paymentCategories.interval.totalPrice也加进去了,这会把该字段不同值的行拆成不同分组,没法正确拿到每个mesano对应的最大revisão行。
内容的提问来源于stack exchange,提问作者Alexandro Nascimento
相关产品推荐
相关产品推荐

