如何用df_new更新扩展df_old:重复DateTime键保留新记录
用Pandas实现DataFrame更新:新数据覆盖重复键
问题描述
现有两个结构完全一致的DataFrame df_old 和 df_new,以DateTime列为唯一键。需要合并两者,重复键仅保留df_new中的记录,得到更新后的DataFrame。
示例数据
df_old:
DateTime B C 2024-09-21 12.9 5.4 2024-09-22 13.1 5.4
df_new:
DateTime B C 2024-09-22 13.2 5.2 2024-09-23 13.4 4.9
期望结果 df_updated:
DateTime B C 2024-09-21 12.9 5.4 2024-09-22 13.2 5.2 # 新值覆盖旧记录 2024-09-23 13.4 4.9
解决方案
方法1:concat + drop_duplicates(直观易理解)
通过合并两个DataFrame后去重,保留df_new的重复键记录:
import pandas as pd # 构造示例数据(实际使用时替换为你的DataFrame) df_old = pd.DataFrame({ 'DateTime': ['2024-09-21', '2024-09-22'], 'B': [12.9, 13.1], 'C': [5.4, 5.4] }) df_new = pd.DataFrame({ 'DateTime': ['2024-09-22', '2024-09-23'], 'B': [13.2, 13.4], 'C': [5.2, 4.9] }) # 合并并去重:将df_new放在后面,保留最后出现的重复行 df_updated = pd.concat([df_old, df_new]) \ .drop_duplicates(subset='DateTime', keep='last') \ .sort_values('DateTime') \ .reset_index(drop=True) print(df_updated)
逻辑说明:
pd.concat([df_old, df_new])按顺序合并两个DataFrame,df_new的行在df_old之后;drop_duplicates(subset='DateTime', keep='last')按DateTime去重,保留最后出现的行(即df_new的重复键记录);sort_values('DateTime')保证结果按日期排序,reset_index(drop=True)重置索引避免混乱。
方法2:combine_first(适合索引操作场景)
将DateTime设为索引后,用combine_first实现覆盖:
import pandas as pd # 构造示例数据 df_old = pd.DataFrame({ 'DateTime': ['2024-09-21', '2024-09-22'], 'B': [12.9, 13.1], 'C': [5.4, 5.4] }) df_new = pd.DataFrame({ 'DateTime': ['2024-09-22', '2024-09-23'], 'B': [13.2, 13.4], 'C': [5.2, 4.9] }) # 设置DateTime为索引 df_old_idx = df_old.set_index('DateTime') df_new_idx = df_new.set_index('DateTime') # 用df_new覆盖重复索引,补充df_old独有的索引 df_updated = df_new_idx.combine_first(df_old_idx) \ .reset_index() \ .sort_values('DateTime') print(df_updated)
逻辑说明:
combine_first会优先保留左边DataFrame(df_new_idx)的所有数据,仅用右边DataFrame(df_old_idx)填充左边缺失的索引行;- 最后恢复
DateTime为列并排序,得到目标结果。
内容的提问来源于stack exchange,提问作者glades
相关产品推荐
相关产品推荐

