如何按指定键分组并保留C列最大值行实现DataFrame去重?
按分组选择C列最大值的行
嘿,我来帮你搞定这个需求!你想要基于A和B这两个键分组,然后选出每组里C列数值最大的行对吧?这里有两种实用的方法可以实现:
首先先确认下原始数据:
import pandas as pd dff = pd.DataFrame({"A":["foo", "foo", "foo", "bar"], "B":["A","A","B","A"], "C":[0,3,1,1]})
方法一:用groupby + idxmax()直接定位最大值行
这种方法效率很高,适合处理较大的数据集:
# 按A、B分组,找出每组中C列最大值对应的行索引 max_row_indices = dff.groupby(['A', 'B'])['C'].idxmax() # 根据索引筛选出目标行,重置索引让结果更整洁 result = dff.loc[max_row_indices].reset_index(drop=True)
运行后得到的结果:
A B C 0 foo A 3 1 foo B 1 2 bar A 1
方法二:先排序再去重,逻辑更直观
如果你觉得分组索引的方式有点绕,也可以用排序+去重的思路:
# 先按A、B升序,再按C降序排序,这样每组里C最大的行会排在最前面 sorted_df = dff.sort_values(['A', 'B', 'C'], ascending=[True, True, False]) # 按A、B去重,只保留每组的第一行(也就是C最大的行) result = sorted_df.drop_duplicates(subset=['A', 'B'], keep='first').reset_index(drop=True)
这个方法得到的结果和上面完全一致,逻辑更容易理解。
小说明
注意你提到的期望输出里foo B对应的C是3,这和原始数据里的数值不符哦~原始数据中foo B的C值只有1,所以正确的结果里这一行的C应该是1。如果是输入数据写错了,调整数据后这两种方法依然适用!
内容的提问来源于stack exchange,提问作者mllamazares
相关产品推荐
相关产品推荐

