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

如何为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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 14:31:51