Pandas大数据量下按分组取对应列最小值的高效方法咨询
高效实现分组添加最小日期列
需求场景
现有如下结构的DataFrame:
| matter | work_date |
|---|---|
| 1 | 01/01/2020 |
| 2 | 01/02/2020 |
| 1 | 01/04/2020 |
| 2 | 01/05/2020 |
需要新增first_date列,值为相同matter分组下的最小work_date,预期结果:
| matter | work_date | first_date |
|---|---|---|
| 1 | 01/01/2020 | 01/01/2020 |
| 2 | 01/02/2020 | 01/02/2020 |
| 1 | 01/04/2020 | 01/01/2020 |
| 2 | 01/05/2020 | 01/02/2020 |
原低效代码问题
你当前使用的逐行apply方法在处理30万行数据时速度极慢,核心原因是逐行循环+重复筛选分组数据,开销极大:
min_dict = {} def check_dict(val): return min_dict.setdefault(val,min(df[df['tmatter']==val]['tworkdt'])) df['first_day'] = df.apply (lambda row: check_dict(row.tmatter), axis = 1)
高效解决方案
用pandas内置的groupby+transform矢量化操作,效率提升明显:
import pandas as pd # 第一步:确保日期列是datetime类型(如果原始数据是字符串格式) df['work_date'] = pd.to_datetime(df['work_date'], format='%m/%d/%Y') # 第二步:分组计算最小值并广播到每一行 df['first_date'] = df.groupby('matter')['work_date'].transform('min') # 可选:如果需要转回原字符串格式 df['first_date'] = df['first_date'].dt.strftime('%m/%d/%Y')
优势说明
- 全程矢量化操作,避免Python层面的循环开销,处理百万级数据也能快速完成
groupby是pandas底层优化过的分组逻辑,比手动筛选分组高效得多transform自动将聚合结果匹配到原DataFrame的对应行,无需手动维护字典映射
内容的提问来源于stack exchange,提问作者zac
相关产品推荐
相关产品推荐

