如何用Pandas基于关联ID填充DataFrame中派生项的缺失标签?
Pandas实现派生项标签填充方案
核心思路
先从原数据中提取**主项(无Derived Item ID的行)**的Main Item ID与对应标签的映射关系,再通过派生项的Derived Item ID关联主项ID,将标签批量填充到派生项的空标签字段中。
步骤实现
1. 构建示例数据集
先还原你提供的示例数据:
import pandas as pd import numpy as np # 构造示例DataFrame df = pd.DataFrame({ 'Bucket': [26, 26], 'Main Item ID': [123, 765], 'Item Name': ['Item A', 'Item A (Derived)'], 'Item Tag 1': [50, np.nan], 'Item Tag 2': [1000, np.nan], 'Item Tag 3': [250, np.nan], 'Derived Item ID': [np.nan, 123] })
2. 创建主项标签映射表
筛选出所有主项(Derived Item ID为空的行),提取Main Item ID和所有标签列,将Main Item ID设为索引,方便后续快速匹配:
# 提取主项的ID-标签映射 tag_mapping = df[df['Derived Item ID'].isna()].set_index('Main Item ID')[['Item Tag 1', 'Item Tag 2', 'Item Tag 3']]
3. 批量填充派生项标签
通过Derived Item ID关联映射表,将匹配到的标签填充到原DataFrame的空标签字段:
# 定位派生项行,用Derived Item ID匹配映射表中的标签 derived_mask = df['Derived Item ID'].notna() df.loc[derived_mask, ['Item Tag 1', 'Item Tag 2', 'Item Tag 3']] = df.loc[derived_mask, 'Derived Item ID'].map(tag_mapping.to_dict('index')).apply(pd.Series)
验证结果
执行上述代码后,输出df即可得到期望结果:
Bucket Main Item ID Item Name Item Tag 1 Item Tag 2 Item Tag 3 Derived Item ID 0 26 123 Item A 50.0 1000.0 250.0 NaN 1 26 765 Item A (Derived) 50.0 1000.0 250.0 123.0
补充说明
- 该方法用Pandas向量化操作替代低效
for循环,适合处理大规模数据 - 若存在多Bucket场景(不同Bucket下可能有重复Main Item ID),可构建复合索引确保匹配准确性:
# 多Bucket场景下的映射表 tag_mapping = df[df['Derived Item ID'].isna()].set_index(['Bucket', 'Main Item ID'])[['Item Tag 1', 'Item Tag 2', 'Item Tag 3']] # 多Bucket场景下的填充 df.loc[derived_mask, ['Item Tag 1', 'Item Tag 2', 'Item Tag 3']] = df.loc[derived_mask, ['Bucket', 'Derived Item ID']].apply(lambda x: tag_mapping.loc[(x['Bucket'], x['Derived Item ID'])], axis=1)
内容的提问来源于stack exchange,提问作者Apetri52
相关产品推荐
相关产品推荐

