如何合并带时间戳的pandas DataFrame且不覆盖原有旧数据?
如何用Pandas合并两个DataFrame并保留旧数据的原有内容
原始数据A
timestamp,some_value 389434893,abc 348973493,dac 128197291,fgd
更新数据B
这是A的更新版本,包含更多数据,部分原有行的some_value字段已修改,但timestamp未变:
timestamp,some_value 389434893,wwwwwwe # timestamp未变更 348973493,wwwwags # timestamp未变更 128197291,wwaswww # timestamp未变更 982379283,ggg
合并需求
合并A与B时,必须保留A中原有行的全部内容(哪怕B里对应timestamp的some_value已经修改),同时添加B里A没有的新行,最终结果如下:
timestamp,some_value 389434893,abc # 来自A 348973493,dac # 来自A 128197291,fgd # 来自A 982379283,ggg # 来自B的新行
实现方法
推荐两种简单直接的Pandas操作方式:
方法一:拼接后去重
先把A放在前面、B放在后面拼接成一个大DataFrame,再按timestamp去重,保留第一次出现的行(也就是A里的原始内容):
import pandas as pd # 假设已加载好df_a(对应数据A)和df_b(对应数据B) df_a = pd.read_csv("data_a.csv") df_b = pd.read_csv("data_b.csv") # 合并并去重 result = pd.concat([df_a, df_b]).drop_duplicates(subset="timestamp", keep="first")
方法二:提取新行再合并
先筛选出B中timestamp不在A里的新行,再把这些新行和A直接拼接:
import pandas as pd df_a = pd.read_csv("data_a.csv") df_b = pd.read_csv("data_b.csv") # 筛选B中的新行 new_rows_from_b = df_b[~df_b["timestamp"].isin(df_a["timestamp"])] # 合并A和新行 result = pd.concat([df_a, new_rows_from_b])
内容的提问来源于stack exchange,提问作者comonadd
相关产品推荐
相关产品推荐

