如何用Pandas将副DataFrame数据填充主DataFrame的缺失列值?
解决DataFrame缺失值填补问题
你之前用pd.merge(df1, df2, how='inner', on='Year')踩了两个坑:
how='inner'是内连接,只保留两个表共有的年份(2019、2020),自然会丢失2021-2023的数据- 两个表都有
V1列,merge后会自动给重复列加_x(来自df1)、_y(来自df2)后缀,导致重复列
下面给你三种适合新手的解决方案,任选其一即可:
方法一:左连接后合并列
先通过左连接保留主表(df1)的所有行,再用df2的V1填补df1的空值:
import pandas as pd # 模拟你的数据 df1 = pd.DataFrame({ 'Year': [2023, 2022, 2021, 2020, 2019], 'V1': ['X0', 'X1', 'X2', pd.NA, pd.NA], 'V2': ['Y0', 'Y1', 'Y2', 'Y3', 'Y4'], 'V3': ['Z0', 'Z1', 'Z2', 'Z3', 'Z4'], 'V4': ['A0', 'A1', 'A2', 'A3', 'A4'] }) df2 = pd.DataFrame({ 'Year': [2020, 2019], 'V1': ['X3', 'X4'] }) # 左连接:保留df1所有行,匹配df2对应年份的数据 merged = pd.merge(df1, df2, how='left', on='Year') # 用df2的V1(V1_y)填补df1的V1(V1_x)空值 merged['V1'] = merged['V1_x'].combine_first(merged['V1_y']) # 删除多余的重复列 df3 = merged.drop(['V1_x', 'V1_y'], axis=1) print(df3)
方法二:用update直接更新(最简洁)
update方法会直接用df2的非空值覆盖df1的空值,前提是两个表的索引匹配:
# 把df2的索引设为Year,方便按年份匹配 df2.set_index('Year', inplace=True) # 用df2的V1更新df1的V1(只更新df1中空的部分) df1.update(df2) # 此时df1就是你要的结果,也可以复制一份避免修改原数据 df3 = df1.copy() print(df3)
方法三:用combine_first自动填补
combine_first会自动用右侧DataFrame的值填补左侧的空值,同样需要索引匹配:
# 两个表都设置Year为索引 df1_idx = df1.set_index('Year') df2_idx = df2.set_index('Year') # 填补空值后重置索引,恢复Year列 df3 = df1_idx.combine_first(df2_idx).reset_index() print(df3)
三种方法最终都会得到你想要的DF3结果。
内容的提问来源于stack exchange,提问作者Paul Haefele
相关产品推荐
相关产品推荐

