如何在两个Pandas DataFrame间匹配ID并更新首个DataFrame的状态列
解决Pandas DataFrame匹配更新并保留最新记录的问题
现有数据
df数据:
| system_time | status | id | date |
|---|---|---|---|
| 2022-03-04T07:52:26Z | Pending | 772 | 2022-03-04 07:52:26+00:00 |
| 2022-06-22T17:52:42Z | Pending | 963 | 2022-06-22 17:52:42+00:00 |
| 2022-08-13T01:34:44Z | Pending | 1052 | 2022-08-13 01:34:44+00:00 |
| 2022-08-24T01:46:31.115Z | Complete | 1052 | 2022-08-24 01:46:31.115000+00:00 |
| 2022-08-14T06:04:54.736Z | Pending | 1053 | 2022-08-14 06:04:54.736000+00:00 |
| 2022-03-04T17:51:15.025Z | Pending | 772 | 2022-03-04 17:51:15.025000+00:00 |
| 2022-08-24T06:24:54.736Z | Inprogress | 999 | 2022-08-24 06:24:54.736000+00:00 |
df1数据:
| id | task_status |
|---|---|
| 1052 | Complete |
| 889 | Pending |
| 772 | Complete |
| 963 | Pending |
df列类型:
system_time - object status - object id - int64 date - object
已执行转换代码:
df['date'] = pd.to_datetime(df['system_time'])
需求
- 基于
id匹配df和df1,匹配成功则将df的status替换为df1的task_status - 保留df中每个
id的最新记录(按date字段取最晚时间的行) - 未匹配到df1的
id,保持原status不变
预期输出
| system_time | status | id | date |
|---|---|---|---|
| 2022-06-22T17:52:42Z | Pending | 963 | 2022-06-22 17:52:42+00:00 |
| 2022-08-24T01:46:31.115Z | Complete | 1052 | 2022-08-24 01:46:31.115000+00:00 |
| 2022-08-14T06:04:54.736Z | Pending | 1053 | 2022-08-14 06:04:54.736000+00:00 |
| 2022-03-04T17:51:15.025Z | Complete | 772 | 2022-03-04 17:51:15.025000+00:00 |
| 2022-08-24T06:24:54.736Z | Inprogress | 999 | 2022-08-24 06:24:54.736000+00:00 |
解决方案
按以下步骤实现:
- 合并数据:用左连接将df1的
task_status关联到df中,确保不丢失df的任何行 - 更新status字段:对匹配到的id,用
task_status覆盖原status;未匹配的保持原状态 - 筛选最新记录:按
id分组,每个组内取date最大的行 - 整理结果:重置索引并恢复原列顺序
完整代码:
# 1. 左连接合并df和df1,关联task_status merged_df = df.merge(df1, on='id', how='left') # 2. 更新status列:有task_status则替换,否则保留原status merged_df['status'] = merged_df['task_status'].fillna(merged_df['status']) # 3. 按id分组,取每个id的最新记录(date最大的行) # 先按date降序排序,再分组取第一行 result_df = merged_df.sort_values('date', ascending=False).groupby('id').first().reset_index() # 4. 恢复原列顺序(去掉task_status列) result_df = result_df[['system_time', 'status', 'id', 'date']] # 输出结果 print(result_df)
执行上述代码后,即可得到符合预期的输出。
内容的提问来源于stack exchange,提问作者deepu2711
相关产品推荐
相关产品推荐

