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

基于两个不同DataFrame匹配数据填充布尔列的实现咨询

实现方案(基于Pandas)

核心思路

  • 先将contract_df的宽表结构(1/2/3为列名)转换为可匹配的长表结构
  • 按匹配规则(Num=VenNum、FiscalPeriod取值匹配、CC列对应df的Bool列名)关联两个表
  • 替换原df中的Bool列值得到结果

代码实现

首先导入依赖:

import pandas as pd

构造示例数据(真实数据场景可跳过)

# 构造原始df
df = pd.DataFrame({
    'VenNum': ['001', '002'],
    'FiscalPeriod': [1, 3],
    'Bool1': [False, False],
    'Bool2': [False, False],
    'Bool3': [False, False]
})

# 构造合同表contract_df
contract_df = pd.DataFrame({
    'Num': ['001','001','001','002','002','002'],
    'CC': ['Bool1','Bool2','Bool3','Bool1','Bool2','Bool3'],
    1: [True, True, True, False, False, False],
    2: [False, False, False, False, False, False],
    3: [False, False, False, True, True, True]
})

数据处理逻辑

# 1. 重塑contract_df,把1/2/3列转为行,统一FiscalPeriod字段类型避免匹配失败
contract_melt = contract_df.melt(
    id_vars=['Num', 'CC'],
    var_name='FiscalPeriod',
    value_name='bool_val'
)
contract_melt['FiscalPeriod'] = contract_melt['FiscalPeriod'].astype(int)

# 2. 把contract转为和df结构对齐的宽表
contract_pivot = contract_melt.pivot(
    index=['Num', 'FiscalPeriod'],
    columns='CC',
    values='bool_val'
).reset_index()

# 3. 关联两个表,替换Bool列值
result = df.drop(columns=['Bool1','Bool2','Bool3']).merge(
    contract_pivot,
    left_on=['VenNum', 'FiscalPeriod'],
    right_on=['Num', 'FiscalPeriod'],
    how='left'
).drop(columns='Num')

结果输出

执行print(result)即可得到目标结构:

VenNumFiscalPeriodBool1Bool2Bool3
0011TrueTrueTrue
0023TrueTrueTrue

注意事项

  • 如果存在匹配不到的场景,可在merge后加上.fillna(False)保留原始的False默认值
  • 务必确保两个表的VenNum/Num、FiscalPeriod字段类型一致,避免关联异常

内容的提问来源于stack exchange,提问作者FH_Mad_SWF

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.27 12:54:09