如何为DataFrame按ID标记唯一最早起始日期的Primary?列
实现DataFrame标记Primary列的最优方法
原始DataFrame
ID Job Start Date 1 Driver 1951-01-01 1 Cleaner 2000-05-01 1 Staff 1951-01-01 2 Staff 2000-05-02 2 Staff2 2000-05-01 2 Cleaner 2000-04-01 5 Driver 1951-01-01
需求说明
新增名为Primary?的列,取值为Yes或No,规则如下:
- 对每个
ID,将该ID下最早Start Date对应的首次出现行标记为Yes;若同一ID下有多个行起始日期相同,仅选首次出现的那一行 - 该
ID下其余所有行标记为No - 最终每个
ID仅一行标记为Yes
最优实现方法
使用Pandas的groupby结合rank方法,代码简洁且性能优异,适合处理大数据量:
import pandas as pd import numpy as np # 初始化示例DataFrame data = { 'ID': [1,1,1,2,2,2,5], 'Job': ['Driver', 'Cleaner', 'Staff', 'Staff', 'Staff2', 'Cleaner', 'Driver'], 'Start Date': ['1951-01-01', '2000-05-01', '1951-01-01', '2000-05-02', '2000-05-01', '2000-04-01', '1951-01-01'] } df = pd.DataFrame(data) # 转换日期类型,确保排序/比较逻辑准确 df['Start Date'] = pd.to_datetime(df['Start Date']) # 按ID分组,对Start Date进行排名(method='first'保证首次出现的最小日期行排名为1) df['Primary?'] = np.where(df.groupby('ID')['Start Date'].rank(method='first') == 1, 'Yes', 'No')
最终结果
ID Job Start Date Primary? 1 Driver 1951-01-01 Yes 1 Cleaner 2000-05-01 No 1 Staff 1951-01-01 No 2 Staff 2000-05-02 No 2 Staff2 2000-05-01 No 2 Cleaner 2000-04-01 Yes 5 Driver 1951-01-01 Yes
方法优势
- 性能高效:Pandas内置的
groupby和rank操作经过底层优化,处理十万级以上数据也能快速完成 - 逻辑清晰:直接对应需求,通过
rank(method='first')精准定位每个ID组内首次出现的最早日期行 - 代码简洁:仅需两行核心代码完成需求,易读易维护
内容的提问来源于stack exchange,提问作者Paulo Cortez
相关产品推荐
相关产品推荐

