基于日期合并两个DataFrame并去除重复值的技术求助
基于日期合并DataFrame并去重的解决方案
原代码使用pd.concat()行堆叠两个DataFrame,导致共同日期重复出现,无法满足「日期唯一、所有列值完整填充」的需求。以下是两种可行的解决方法:
方法1:堆叠后按日期分组聚合
先堆叠两个DataFrame,再以日期为分组依据,取每组的第一个有效值(因同日期的A、B值在两个源DataFrame中一致,C列仅存在于df_2):
import pandas as pd dict1 = {"Date":["2000-01-01", "2000-01-04", "2000-01-05", "2000-01-07"], "A":[99, 93,100,97], "B": [106,107,109,105]} dict2 = {"Date":["2000-01-01", "2000-01-03", "2000-01-05", "2000-01-07"], "A":[99, 96,100,97], "B": [106,100,109,105], "C":[2,5,8,4]} # 初始化DataFrame并处理日期索引 df_1 = pd.DataFrame(dict1) df_1["Date"] = pd.to_datetime(df_1["Date"]) df_1.set_index("Date", inplace=True) df_2 = pd.DataFrame(dict2) df_2["Date"] = pd.to_datetime(df_2["Date"]) df_2.set_index("Date", inplace=True) # 堆叠后分组去重 df_1_2 = pd.concat([df_1, df_2]).groupby(level=0).first() # 可选:将日期从索引转回列 # df_1_2.reset_index(inplace=True) print(df_1_2)
输出结果中所有日期唯一,A、B列值正确填充,C列仅在df_2包含的日期处有值(若需填充缺失值,可添加df_1_2.fillna(0, inplace=True)等操作)。
方法2:使用外连接合并
直接基于Date列做外连接,合并两个DataFrame后处理重复列:
import pandas as pd dict1 = {"Date":["2000-01-01", "2000-01-04", "2000-01-05", "2000-01-07"], "A":[99, 93,100,97], "B": [106,107,109,105]} dict2 = {"Date":["2000-01-01", "2000-01-03", "2000-01-05", "2000-01-07"], "A":[99, 96,100,97], "B": [106,100,109,105], "C":[2,5,8,4]} # 初始化DataFrame并处理日期(无需设置索引) df_1 = pd.DataFrame(dict1) df_1["Date"] = pd.to_datetime(df_1["Date"]) df_2 = pd.DataFrame(dict2) df_2["Date"] = pd.to_datetime(df_2["Date"]) # 外连接合并 df_1_2 = pd.merge(df_1, df_2, on="Date", how="outer", suffixes=('_x', '_y')) # 合并重复的A、B列(同日期值一致,取非空值即可) df_1_2['A'] = df_1_2['A_x'].combine_first(df_1_2['A_y']) df_1_2['B'] = df_1_2['B_x'].combine_first(df_1_2['B_y']) # 删除冗余列并排序 df_1_2.drop(['A_x', 'A_y', 'B_x', 'B_y'], axis=1, inplace=True) df_1_2.sort_values('Date', inplace=True) print(df_1_2)
该方法无需操作索引,直接通过Date列完成合并,结果同样满足日期唯一、列值完整的要求。
内容的提问来源于stack exchange,提问作者Krishnendu Dutta
相关产品推荐
相关产品推荐

