You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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)

输出结果和方法一完全一致。

原代码的问题说明

  1. 效率低下:双重循环是O(n²)时间复杂度,当DataFrame有上万行时会非常卡顿,而Pandas的向量化操作是O(n)或O(n log n)级别,性能差距明显。
  2. 索引操作不安全:在循环中直接drop并通过concat重置索引,会导致后续循环的索引混乱,容易出现逻辑错误。
  3. 错误处理不当:try-except: pass会吞掉所有异常,无法排查代码中的潜在问题(比如类型转换错误、索引越界等)。

内容的提问来源于stack exchange,提问作者mothman

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.12 12:12:07