如何合并两个带Timestamp索引的Pandas DataFrame?
合并带时间戳索引的Pandas DataFrame(处理冲突值与保留全量索引/列)
直接用以下代码即可实现需求,先预处理解决值冲突,再完成合并:
import pandas as pd import numpy as np # 示例输入数据 df1 = pd.DataFrame( { "PT1": ["A0", "A1", "A2"], "PT2": ["B0", "B1", "B2"], "PT3": ["C0", "C1", "C2"], }, index=pd.DatetimeIndex(["2025-05-01 10:00", "2025-05-01 10:01", "2025-05-01 10:02"]), ) df2 = pd.DataFrame( { "PT1": ["A0", "A1", "A3"], "PT4": ["D0", "D1", "D3"], }, index=pd.DatetimeIndex(["2025-05-01 10:00", "2025-05-01 10:01", "2025-05-01 10:03"]), ) # 步骤1:预处理df2,替换与df1冲突的值为NaN common_indices = df1.index.intersection(df2.index) common_columns = df1.columns.intersection(df2.columns) # 提取共有的数据区域进行对比 df1_common = df1.loc[common_indices, common_columns] df2_common = df2.loc[common_indices, common_columns] # 标记值不同的位置,将df2对应位置设为NaN conflict_mask = df1_common != df2_common df2.loc[common_indices, common_columns] = df2.loc[common_indices, common_columns].mask(conflict_mask) # 步骤2:合并两个DataFrame,保留所有时间戳和列 df_merged = df1.combine_first(df2) # 按时间戳排序(可选,确保索引有序) df_merged = df_merged.sort_index() print(df_merged)
关键步骤说明
预处理冲突值
- 先定位两个DataFrame共有的时间戳和列,只处理可能存在值冲突的区域
- 对比相同位置的值,将df2中与df1不同的数值替换为
NaN,避免合并时覆盖df1的有效数据
合并逻辑
combine_first()方法会自动对齐时间戳索引和列:- 最终结果的索引是两个DataFrame时间戳的并集
- 最终结果的列是两个DataFrame列的并集
- 优先保留df1的非空值,用df2的非空值填充df1的缺失部分,同时保留df2独有的时间戳和列
冲突场景测试
如果df2的PT1在2025-05-01 10:00的值为"A0_conflict"(与df1的"A0"不同),预处理后该值会被替换为NaN,合并后df1的"A0"会被保留,不会被覆盖。
内容的提问来源于stack exchange,提问作者Enesma
相关产品推荐
相关产品推荐

