You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何基于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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.17 16:35:05