如何过滤删除DataFrame重复条目,保留各ID对应最大Number的整行数据
实现方案
pandas 提供了内置方法可以高效实现该需求,无需手动编写循环遍历,以下两种常用方案都可以保留对应最大Number的Department字段:
方案1:排序后去重(逻辑直观易理解)
先按ID升序、Number降序排序,每个ID对应的第一条数据就是Number最大的条目,随后按ID去重保留第一条即可:
# 按ID升序、Number降序排序 df_sorted = df.sort_values(by=['ID', 'Number'], ascending=[True, False]) # 按ID去重,保留每个ID的第一条数据 result = df_sorted.drop_duplicates(subset='ID', keep='first')
直接输出result即可得到期望结果。
方案2:分组取最大值索引(代码更简洁)
通过groupby按ID分组,直接定位每个分组内Number最大值对应的行索引,再根据索引取全量字段:
result = df.loc[df.groupby('ID')['Number'].idxmax()]
原代码问题说明
你编写的两层嵌套循环会将所有ID对和Number对交叉匹配,无法将同一行的ID和Number对应,自然会出现重复输出、匹配错误的问题,完全不需要手动实现遍历逻辑,内置方法已经做了性能优化,处理大数据量时效率远高于自定义循环。
完整可运行测试示例
import pandas as pd # 构造示例数据 data = { 'ID': [2324, 2324, 2324, 2400, 2593, 2593], 'Department': ['Art', 'Math', 'Art', 'Science', 'Tech', 'Math'], 'Number': [4, 1, 3, 2, 5, 1] } df = pd.DataFrame(data) # 方案1执行 df_sorted = df.sort_values(by=['ID', 'Number'], ascending=[True, False]) result1 = df_sorted.drop_duplicates(subset='ID', keep='first') print("方案1输出:") print(result1) # 方案2执行 result2 = df.loc[df.groupby('ID')['Number'].idxmax()] print("\n方案2输出:") print(result2)
运行后两种方案输出均符合预期。
内容的提问来源于stack exchange,提问作者shorttriptomars
相关产品推荐
相关产品推荐

