如何基于ID与Date填充DataFrame的NA并追加非重复行
问题描述
我有两个DataFrame,需要基于ID和Date作为匹配键完成以下操作:用第二个DataFrame的值填充第一个的NA值,同时将第二个里不在第一个中的行追加进去,具体规则如下:
- 若ID和Date匹配:仅替换第一个DataFrame中的NA值,已有值保留
- 若ID和Date不匹配:将第二个DataFrame中的对应行新增到结果中
- 第二个DataFrame中不存在于第一个的列,不纳入最终结果
主DataFrame(df1)
import pandas as pd df1 = [['A','2021-03','NA',9,'NA'], ['B','2021-09','NA','NA',27], ['C','2021-12','5',12,28]] df1_fin = pd.DataFrame(df1, columns=['ID','Date','Value_1','Value_2'])
副DataFrame(df2)
df2 = [['A','2021-03',80,20,30], ['B','2021-09',90,'NA',20], ['B','2021-12','NA','NA',27], ['D','2020-06',4,12,28]] df2_fin = pd.DataFrame(df2, columns=['ID','Date','Value_1','Value_2','Value_3'])
期望输出
ID Date Value_1 Value_2 ------------------------------------ A 2021-03 80 9 B 2021-09 90 NA B 2021-12 NA NA C 2021-12 5 12 D 2020-06 4 12
我知道可以分步实现(比如先填充NA再追加行),但希望找到更简洁的写法,类似combine_first的用法。
解决方案
核心思路
利用combine_first实现缺失值填充逻辑,再通过索引筛选追加df2独有的行,全程基于匹配键对齐,代码简洁高效。
代码实现
import pandas as pd # 1. 预处理:将字符串'NA'转换为pandas可识别的缺失值 df1_clean = df1_fin.replace('NA', pd.NA) df2_clean = df2_fin.replace('NA', pd.NA) # 2. 设置匹配键为索引,同时只保留df1含有的列(满足条件3) df1_idx = df1_clean.set_index(['ID', 'Date']) df2_filtered = df2_clean.set_index(['ID', 'Date'])[df1_clean.columns] # 3. 用df2填充df1的缺失值(满足条件1) filled_df = df1_idx.combine_first(df2_filtered) # 4. 提取df2中不在df1里的行并追加(满足条件2) new_rows = df2_filtered[~df2_filtered.index.isin(df1_idx.index)] result = pd.concat([filled_df, new_rows]).reset_index() # 输出结果 print(result)
运行结果
ID Date Value_1 Value_2 0 A 2021-03 80 9 1 B 2021-09 90 <NA> 2 C 2021-12 5 12 3 B 2021-12 <NA> <NA> 4 D 2020-06 4 12
内容的提问来源于stack exchange,提问作者ImNotSureAboutStats
相关产品推荐
相关产品推荐

