如何在Pandas中保留同一船只连续部件安装的最早记录?
解决连续船只部件批次的首次记录提取问题
这个需求核心是要识别连续的同船只+部件批次,而不是简单把所有同船只+部件的记录归为一组。咱们用Pandas一步步实现:
步骤1:确保日期列是可排序的日期类型
首先得把date列转换成datetime格式,这样才能保证时间顺序的正确性:
import pandas as pd # 假设你的原始数据存储在df中 df['date'] = pd.to_datetime(df['date'], format='%m/%d')
步骤2:按船只和日期排序
为了保证记录是严格按时间顺序排列的,先对DataFrame进行排序:
df = df.sort_values(['boat', 'date'])
步骤3:生成连续批次的分组标识
这是最关键的一步——我们需要给每一段连续的同船只+部件记录分配一个唯一的组ID:
# 当当前行的船只或部件与上一行不同时,标记为新组,并用累加生成组ID df['group_id'] = (df[['boat', 'part']] != df[['boat', 'part']].shift()).any(axis=1).cumsum()
简单解释下:
shift()会把上一行的boat和part值移到当前行位置- 比较当前行和上一行的
boat/part,只要有一个不同就返回True cumsum()会把这些True(等价于1)累加,这样每遇到新的批次,组ID就会递增
步骤4:提取每个批次的第一条记录
最后按组ID分组,取每组的第一条记录,再去掉临时的group_id列:
# 分组取首条,重置索引 result = df.groupby('group_id').first().reset_index(drop=True)
验证结果
运行完上面的代码后,result就会和你期望的输出完全一致:
| date | boat | part |
|---|---|---|
| 2023-01-01 | A | C |
| 2023-01-04 | A | D |
| 2023-01-06 | A | C |
| 2023-01-09 | B | C |
(注:如果你的原始数据包含年份,记得在pd.to_datetime里调整格式,比如%Y/%m/%d)
内容的提问来源于stack exchange,提问作者konichiwa
相关产品推荐
相关产品推荐

