Python中Pandas DataFrame更新数据筛选的高效实现方案问询
高效实现按组保留最大Update Number的行
你的需求本质是对Department和Ticket ID的组合分组,保留每组中Update Number最大的行,原代码的双重循环在数据量大时效率极低,Pandas提供了原生的向量化操作可以大幅提升性能,以下是两种更高效的实现方式:
方法一:使用groupby + idxmax
这种方法直接按分组找到最大Update Number对应的索引,再筛选行,逻辑清晰且性能最优:
import pandas as pd # 构造示例数据 df = pd.DataFrame({ 'Department': ['HR', 'DEV', 'HR'], 'Ticket ID': ['100', '100', '100'], 'Update Number': ['1', '1', '2'] }) # 先将Update Number转为数值类型(原数据是字符串,比较前需转换) df['Update Number'] = df['Update Number'].astype(int) # 按Department和Ticket ID分组,获取每组Update Number最大的行的索引 max_idx = df.groupby(['Department', 'Ticket ID'])['Update Number'].idxmax() # 筛选出目标行并重置索引 result_df = df.loc[max_idx].reset_index(drop=True) print(result_df)
输出结果:
Department Ticket ID Update Number 0 DEV 100 1 1 HR 100 2
方法二:使用sort_values + drop_duplicates
这种方法先按分组列排序,再保留每组的最后一行(即Update Number最大的行),代码更简洁:
import pandas as pd df = pd.DataFrame({ 'Department': ['HR', 'DEV', 'HR'], 'Ticket ID': ['100', '100', '100'], 'Update Number': ['1', '1', '2'] }) # 转换类型后,先按分组列排序,再按Update Number降序排序 df['Update Number'] = df['Update Number'].astype(int) result_df = df.sort_values( by=['Department', 'Ticket ID', 'Update Number'], ascending=[True, True, False] ).drop_duplicates(subset=['Department', 'Ticket ID'], keep='first').reset_index(drop=True) print(result_df)
输出结果和方法一完全一致。
原代码的问题说明
- 效率低下:双重循环是O(n²)时间复杂度,当DataFrame有上万行时会非常卡顿,而Pandas的向量化操作是O(n)或O(n log n)级别,性能差距明显。
- 索引操作不安全:在循环中直接
drop并通过concat重置索引,会导致后续循环的索引混乱,容易出现逻辑错误。 - 错误处理不当:
try-except: pass会吞掉所有异常,无法排查代码中的潜在问题(比如类型转换错误、索引越界等)。
内容的提问来源于stack exchange,提问作者mothman
相关产品推荐
相关产品推荐

