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

如何通过匹配另一DataFrame列填充pandas DataFrame的Id列空值?

解决Pandas DataFrame空值填充问题

问题分析

需要基于Ac和Tp两列的组合匹配关系,用df2的Id值填充df1中Id列的空值,确保匹配的精准性。

原代码的问题

  1. 语法错误:用圆括号()访问DataFrame列,正确写法应为方括号[],比如df1('nan')是错误的,判断空值需用df1['Id'].isna();df2('Ac')['Id']也是错误的索引方式。
  2. 匹配逻辑缺陷:仅通过Ac列映射无法保证精准匹配,若存在相同Ac但不同Tp的记录,会导致填充错误。
  3. 冗余操作: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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.04 22:10:34