如何在Pandas中合并DataFrame并替换指定年份重复数据?
解决DataFrame合并时的重复覆盖问题
这个需求的核心是让df2的2019年数据完全覆盖df1中同类型、同年份的记录,同时保留df1里其他年份的数据,以及df2中独有的类型(比如示例里的d)。我给你两种实用的解决方案:
方法一:提前过滤+合并(高效直接)
先把df1里2019年的记录全部过滤掉,再和完整的df2合并,从根源上避免重复:
import pandas as pd # 过滤df1,只保留非2019年的数据 df1_filtered = df1[df1['year'] != 2019] # 合并过滤后的df1和df2,重置索引 final_df = pd.concat([df1_filtered, df2], ignore_index=True, sort=False)
运行后得到的final_df完全符合你的预期:
| type | year | value | |
|---|---|---|---|
| 0 | a | 2015 | 12 |
| 1 | a | 2016 | 2 |
| 2 | b | 2018 | 50 |
| 3 | c | 2017 | 1 |
| 4 | c | 2016 | 5 |
| 5 | a | 2019 | 13 |
| 6 | b | 2019 | 5 |
| 7 | c | 2019 | 5 |
| 8 | d | 2019 | 20 |
方法二:合并后去重(灵活通用)
如果以后需要覆盖的年份不止2019,或者不想提前写过滤规则,可以先合并两个DataFrame,再通过去重逻辑保留优先级更高的记录(把df2放在concat的后面,用keep='last'确保df2的记录覆盖df1):
# 合并两个DataFrame(暂时保留原顺序) combined_df = pd.concat([df1, df2], ignore_index=False) # 按type和year去重,保留最后出现的记录(即df2的对应记录) final_df = combined_df.drop_duplicates(subset=['type', 'year'], keep='last').reset_index(drop=True)
两种方法对比
- 方法一更高效:减少了合并的数据量,适合处理大规模数据集;
- 方法二更灵活:不需要针对特定年份写过滤条件,只要保证优先级高的DataFrame在concat时放在后面即可。
内容的提问来源于stack exchange,提问作者ah bon
相关产品推荐
相关产品推荐

