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

如何合并两个DataFrame并按date列保留最新有效值?

解决方法:按分组取最新数据实现智能合并

你遇到的问题是pd.merge会生成带_x/_y后缀的重复列,而pd.concat只是单纯追加行,都没法实现按date选取最新值合并重复列的需求。其实我们可以通过「合并所有行 + 分组取最新」的思路来解决,具体步骤如下:

实现代码

import pandas as pd
import numpy as np
np.random.seed(30)

# 原数据定义(和你的代码一致,修正了9月31号的日期错误)
company1 = ('comA','comB','comC','comD')
df1 = pd.DataFrame(columns=None)
df1['company'] = company1
df1['clv']=[100,200,300,400]
df1['date'] = [20191231,20191231,20191001,20190930]
print("\ndf1:")
print(df1)

company2 = ('comC','comD','comE','comF')
df2 = pd.DataFrame(columns=None)
df2['company'] = company2
df2['clv']=[300,450,500,600]
df2['date'] = [20191231,20191231,20191231,20191231]
print("\ndf2:")
print(df2)

# 核心实现逻辑
# 1. 合并两个DataFrame的所有行
combined_df = pd.concat([df1, df2], ignore_index=True)
# 2. 按company分组,每组内按date降序排序,取第一行(最新数据)
df_desired = combined_df.sort_values('date', ascending=False).groupby('company').first().reset_index()
# 3. 按company排序(可选,和目标结果顺序一致)
df_desired = df_desired.sort_values('company').reset_index(drop=True)

print("\ndf_desired:")
print(df_desired)

代码解释

  1. 合并所有行:用pd.concat把两个DataFrame的行全部合并,这样每个company可能有多条记录(比如comC、comD各有2条)。
  2. 分组取最新:
    • 先按date降序排序,确保每个company的最新数据排在组内最前面;
    • 用groupby('company').first()取出每个组的第一行,也就是该company的最新数据;
    • reset_index()把分组后的索引重置为普通列,恢复成常规DataFrame格式。
  3. 可选排序:最后按company排序,让结果和你给出的df_desired顺序完全匹配。

运行结果

执行后会得到你想要的目标DataFrame:

company  clv      date
0    comA  100  20191231
1    comB  200  20191231
2    comC  300  20191231
3    comD  450  20191231
4    comE  500  20191231
5    comF  600  20191231

这个方法逻辑清晰,还能灵活处理更多场景(比如一个company有超过2条记录的情况),完美实现你「值相同保留,值不同取最新」的需求。

内容的提问来源于stack exchange,提问作者Alhpa Delta

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.11 07:18:19