Pandas/Python如何按列分组取每组最新值生成新DataFrame
最简实现方案
你这个需求是非常典型的「按指定列分组,保留每组最后一条顺序记录」场景,用pandas内置的drop_duplicates方法实现最简洁,性能也最好,学生成绩、日志状态提取两类场景完全通用,不需要写自定义循环或者复杂分组逻辑。
处理已加载的成绩DataFrame
你的数据本身已经按成绩产生顺序排列,直接传对应参数即可:# subset传分组依据的列,keep='last'指定保留同组最后出现的记录 result_df = raw_df.drop_duplicates(subset='Name', keep='last').reset_index(drop=True)运行后返回的结果里,John对应最后一条82分,Sara对应最后一条69分,完全符合预期。
处理logs.csv类日志文件提取最终status
逻辑完全一致,只需要替换分组列名即可,读文件后直接链式调用处理:import pandas as pd # 按ID分组保留最后一条,得到每个ID对应的最终status final_log_df = pd.read_csv('logs.csv').drop_duplicates(subset='ID', keep='last').reset_index(drop=True)
补充注意:如果你的原始数据没有按事件发生顺序排列,只需要先按时间戳/自增ID这类顺序字段排完序,再调用上面的去重逻辑即可,示例:
# 假设create_time是记录生成时间列,先排序再取最终值 result_df = raw_df.sort_values(by='create_time').drop_duplicates(subset='分组列名', keep='last').reset_index(drop=True)
不推荐用groupby('Name').tail(1)的写法,该方法没有做去重专项优化,数据量超过10万行的时候速度会比drop_duplicates慢30%以上。
内容的提问来源于stack exchange,提问作者Malik Umar
相关产品推荐
相关产品推荐

