如何在两个Pandas DataFrame间根据ID匹配复制日期数据
解决Pandas DataFrame按ID匹配复制日期的问题
这里提供两种实用方法,帮你快速实现从main_df向second_df按ID匹配复制日期的需求:
方法一:使用merge(推荐,适配重复ID场景)
通过左连接(left join)关联两个DataFrame,自动匹配对应ID的日期,同时保留second_df的所有行:
import pandas as pd # 初始化数据 main_df = pd.DataFrame({ "id": [123, 456, 789, 357, 159], "date": [None, "2022-10-10", "2022-09-15", None, "2022-09-15"], "stuff": [3, 6, 2, 9, 3] }) second_df = pd.DataFrame({ "id": [321, 456, 789, 789, 351], "stuff": [3, 6, 2, 4] }) # 左连接:保留second_df所有行,匹配main_df的date列 result_df = pd.merge(second_df, main_df[["id", "date"]], on="id", how="left") # 按需去重(匹配预期结果,去除重复的id+stuff组合) result_df = result_df.drop_duplicates(subset=["id", "stuff"], keep="first") print(result_df)
执行后会得到你预期的结果:未匹配到ID的行date列自动填充NaN,匹配到的行对应日期会被复制过来。
方法二:使用map(简洁高效,适合ID唯一场景)
先从main_df构建ID到日期的映射字典,再通过map方法快速给second_df添加日期列:
import pandas as pd # 初始化数据 main_df = pd.DataFrame({ "id": [123, 456, 789, 357, 159], "date": [None, "2022-10-10", "2022-09-15", None, "2022-09-15"], "stuff": [3, 6, 2, 9, 3] }) second_df = pd.DataFrame({ "id": [321, 456, 789, 789, 351], "stuff": [3, 6, 2, 4] }) # 构建id到date的映射字典(若main_df有重复ID,会保留最后一个匹配的日期) id_date_map = main_df.set_index("id")["date"].to_dict() # 给second_df添加date列 second_df["date"] = second_df["id"].map(id_date_map) # 按需去重 second_df = second_df.drop_duplicates(subset=["id", "stuff"], keep="first") print(second_df)
方法对比
merge:适合处理存在重复ID、需要更复杂关联逻辑的场景,灵活性更高;map:代码更简洁,执行效率更高,适合main_df中ID唯一的场景。
内容的提问来源于stack exchange,提问作者antusystem
相关产品推荐
相关产品推荐

