如何合并两个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)
代码解释
- 合并所有行:用
pd.concat把两个DataFrame的行全部合并,这样每个company可能有多条记录(比如comC、comD各有2条)。 - 分组取最新:
- 先按
date降序排序,确保每个company的最新数据排在组内最前面; - 用
groupby('company').first()取出每个组的第一行,也就是该company的最新数据; reset_index()把分组后的索引重置为普通列,恢复成常规DataFrame格式。
- 先按
- 可选排序:最后按
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
相关产品推荐
相关产品推荐

