基于两个不同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)即可得到目标结构:
| VenNum | FiscalPeriod | Bool1 | Bool2 | Bool3 |
|---|---|---|---|---|
| 001 | 1 | True | True | True |
| 002 | 3 | True | True | True |
注意事项
- 如果存在匹配不到的场景,可在merge后加上
.fillna(False)保留原始的False默认值 - 务必确保两个表的
VenNum/Num、FiscalPeriod字段类型一致,避免关联异常
内容的提问来源于stack exchange,提问作者FH_Mad_SWF
相关产品推荐
相关产品推荐

