如何根据行列条件从源DataFrame提取值并填充目标DataFrame?
Pandas 按日期匹配填充缺失值
问题说明
现有两个DataFrame:
- df1包含完整的日期及对应
b、c列数据 - df2的
date列顺序与df1不同,b、c列均为缺失值,需根据date匹配,将df1的数据填充到df2中。
示例数据:
df1:
date a b c 0 2011-12-30 100 400 700 1 2021-01-30 200 500 800 2 2021-07-30 300 600 900
df2:
date c b 0 2021-07-30 <NA> <NA> 1 2021-01-30 <NA> <NA> 2 2011-12-30 <NA> <NA>
期望输出:
date c b 0 2021-07-30 900 600 1 2021-01-30 800 500 2 2011-12-30 700 400
解决方案
方法1:合并后赋值
通过merge按date匹配数据,再将对应列的值覆盖到df2:
import pandas as pd # 构造示例数据(实际使用可跳过) df1 = pd.DataFrame({ 'date': ['2011-12-30', '2021-01-30', '2021-07-30'], 'a': [100, 200, 300], 'b': [400, 500, 600], 'c': [700, 800, 900] }) df2 = pd.DataFrame({ 'date': ['2021-07-30', '2021-01-30', '2011-12-30'], 'c': [pd.NA, pd.NA, pd.NA], 'b': [pd.NA, pd.NA, pd.NA] }) # 合并提取目标列 merged_df = df2.merge(df1[['date', 'b', 'c']], on='date', how='left', suffixes=('_orig', '')) # 更新df2的b、c列 df2[['b', 'c']] = merged_df[['b', 'c']] print(df2)
方法2:索引对齐填充
将df1设置为date索引后,利用combine_first直接填充缺失值,写法更简洁:
import pandas as pd # 构造示例数据(实际使用可跳过) df1 = pd.DataFrame({ 'date': ['2011-12-30', '2021-01-30', '2021-07-30'], 'a': [100, 200, 300], 'b': [400, 500, 600], 'c': [700, 800, 900] }) df2 = pd.DataFrame({ 'date': ['2021-07-30', '2021-01-30', '2011-12-30'], 'c': [pd.NA, pd.NA, pd.NA], 'b': [pd.NA, pd.NA, pd.NA] }) # 生成以date为索引的参考表 ref_df = df1.set_index('date')[['b', 'c']] # 对齐索引并填充缺失值 df2 = df2.set_index('date').combine_first(ref_df).reset_index() print(df2)
两种方法均可得到符合预期的输出,方法2更适合仅需填充缺失值的场景。
内容的提问来源于stack exchange,提问作者stvlam22
相关产品推荐
相关产品推荐

