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

如何合并同结构Pandas DataFrame并保留主键对应最新日期行

合并两个Pandas DataFrame并保留主键组内最新日期的行

需求明确:将两个列结构一致的DataFrame合并,当pk1与pk2组成的主键重复时,仅保留DATE最新的行,删除旧日期对应的行。

先构造示例数据

import pandas as pd

# 示例输入的df1和df2
df1 = pd.DataFrame({
    'pk1': [1, 2],
    'pk2': [2, 3],
    'C': [3, 4],
    'DATE': ['05-09-22', '05-09-22']
})

df2 = pd.DataFrame({
    'pk1': [1],
    'pk2': [2],
    'C': [5],
    'DATE': ['06-09-22']
})

处理步骤

1. 合并两个DataFrame

用pd.concat将两个表拼接为一个:

combined_df = pd.concat([df1, df2], ignore_index=True)

2. 将DATE列转换为datetime类型

这一步必须做——如果直接用字符串排序,会出现逻辑错误(比如"10-01-22"会被误判为比"09-30-22"小)。指定格式转成datetime才能正确比较日期先后:

combined_df['DATE'] = pd.to_datetime(combined_df['DATE'], format='%d-%m-%y')

3. 保留每组主键的最新行

以下两种方法任选其一即可:

方法一:排序后去重

先按主键升序、日期降序排序,再对主键组合去重,保留第一行(即日期最新的行):

result = combined_df.sort_values(by=['pk1', 'pk2', 'DATE'], ascending=[True, True, False])\
                   .drop_duplicates(subset=['pk1', 'pk2'], keep='first')\
                   .reset_index(drop=True)
方法二:分组取最大日期的索引

通过groupby找到每个主键组内日期最大的行的索引,再用索引筛选目标行:

# 获取每个主键组中DATE最大的行的索引
max_date_indices = combined_df.groupby(['pk1', 'pk2'])['DATE'].idxmax()
# 按索引提取行
result = combined_df.loc[max_date_indices].reset_index(drop=True)

最终结果

两种方法得到的结果均与期望一致:

pk1  pk2  C       DATE
0    2    3  4 2022-09-05
1    1    2  5 2022-09-06

如果需要将DATE列转回原有的dd-mm-yy字符串格式,添加以下代码即可:

result['DATE'] = result['DATE'].dt.strftime('%d-%m-%y')

内容的提问来源于stack exchange,提问作者Alon G

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.19 23:00:54