如何通过匹配另一DataFrame列填充pandas DataFrame的Id列空值?
解决Pandas DataFrame空值填充问题
问题分析
需要基于Ac和Tp两列的组合匹配关系,用df2的Id值填充df1中Id列的空值,确保匹配的精准性。
原代码的问题
- 语法错误:用圆括号
()访问DataFrame列,正确写法应为方括号[],比如df1('nan')是错误的,判断空值需用df1['Id'].isna();df2('Ac')['Id']也是错误的索引方式。 - 匹配逻辑缺陷:仅通过
Ac列映射无法保证精准匹配,若存在相同Ac但不同Tp的记录,会导致填充错误。 - 冗余操作:
mask方法在此场景下不必要,直接使用fillna即可处理空值。
解决方案
方法一:字典映射法(高效精准)
先将df2转换为以(Ac, Tp)为键、Id为值的字典,再通过apply匹配填充:
# 构造精准匹配的映射字典 id_mapping = df2.set_index(['Ac', 'Tp'])['Id'].to_dict() # 填充df1的Id空值 df1['Id'] = df1['Id'].fillna(df1.apply(lambda row: id_mapping.get((row['Ac'], row['Tp'])), axis=1))
方法二:左连接填充法(直观易理解)
通过merge将df2的匹配Id列合并到df1,再填充空值:
# 左连接获取df2中匹配的Id df1 = df1.merge(df2[['Ac', 'Tp', 'Id']], on=['Ac', 'Tp'], how='left', suffixes=('', '_df2')) # 填充空值并清理临时列 df1['Id'] = df1['Id'].fillna(df1['Id_df2']) df1.drop('Id_df2', axis=1, inplace=True)
验证示例
先构造测试数据:
import pandas as pd # 构造df1 df1 = pd.DataFrame({ 'Ac': ['Efecty', 'Asset', 'Debt', 'Tax'], 'Tp': ['FC', 'FC', 'P&G', 'Other'], 'Id': ['IQ_EF', '', 'IQ_DEBT', ''], '2020': [100, 52, 45, 48], '2021': [200, 48, 58, 45], '2022': [45, 15, 15, 78] }) # 构造df2 df2 = pd.DataFrame({ 'Ac': ['Efecty', 'Asset', 'Debt', 'Tax', 'Income', 'Invest'], 'Tp': ['FC', 'FC', 'P&G', 'Other', 'BAL', 'FC'], 'Id': ['IQ_EF', 'IQ_AST', 'IQ_DEBT', 'IQ_TAX', 'IQ_INC', 'IQ_INV'] })
运行上述任意一种填充方法后,df1的Id列空值将被正确填充为IQ_AST和IQ_TAX,与预期结果一致。
内容的提问来源于stack exchange,提问作者Valeria Arango
相关产品推荐
相关产品推荐

