基于参考数据集的标签条件替换实现方案问询
数据集标签替换方案实现
现有数据集
第一个数据集(df1)
ID Label 0001 0001_1 0001 0001_1 0001 0001_1 0001 0001_1 0001 0001_1 0001 0001_1 0002 0002_1 0002 0002_1 0002 0002_2 0002 0002_2 0002 0002_3 0002 0002_3
第二个数据集(df2)
ID Label 0001 0001_1 0001 0001_1 0001 0001_2 0001 0001_2 0001 0001_3 0001 0001_3 0002 0002_1 0002 0002_1 0002 0002_2 0002 0002_2 0002 0002_3 0002 0002_3
需求说明
- 若第一个数据集中某ID对应的Label仅有一种类型(如ID0001的Label为0001_1),则将第二个数据集中该ID的所有Label替换为该类型
- 若该ID对应多种Label类型,则不做任何处理
期望输出数据集
ID Label 0001 0001_1 0001 0001_1 0001 0001_1 0001 0001_1 0001 0001_1 0001 0001_1 0002 0002_1 0002 0002_1 0002 0002_2 0002 0002_2 0002 0002_3 0002 0002_3
实现方案(Python pandas)
以下是基于pandas的高效实现代码,逻辑清晰易维护:
import pandas as pd # 1. 构造或读取数据集(如果是外部文件,替换为pd.read_csv/pd.read_excel) df1 = pd.DataFrame({ 'ID': ['0001']*6 + ['0002']*6, 'Label': ['0001_1']*6 + ['0002_1']*2 + ['0002_2']*2 + ['0002_3']*2 }) df2 = pd.DataFrame({ 'ID': ['0001']*6 + ['0002']*6, 'Label': ['0001_1']*2 + ['0001_2']*2 + ['0001_3']*2 + ['0002_1']*2 + ['0002_2']*2 + ['0002_3']*2 }) # 2. 提取第一个数据集中单标签ID的映射关系 # 统计每个ID的唯一标签数,同时获取该标签值 id_label_stats = df1.groupby('ID')['Label'].agg(unique_count='nunique', target_label='first').reset_index() # 筛选出只有一种标签的ID single_label_map = id_label_stats[id_label_stats['unique_count'] == 1][['ID', 'target_label']] # 3. 对第二个数据集进行标签替换 # 合并映射表,保留所有df2的行 merged_df = df2.merge(single_label_map, on='ID', how='left') # 替换逻辑:有映射值则替换,无则保留原标签 merged_df['Label'] = merged_df.apply(lambda row: row['target_label'] if pd.notna(row['target_label']) else row['Label'], axis=1) # 移除临时列 result_df = merged_df.drop(columns=['target_label']) # 4. 输出结果(或保存到文件:result_df.to_csv('output.csv', index=False)) print(result_df)
代码逻辑说明
- 第一步:通过
groupby统计每个ID的唯一标签数量,同时取第一个标签(单标签ID的所有标签一致,取第一个即可) - 第二步:筛选出仅有一种标签的ID,建立ID到目标标签的映射表
- 第三步:将映射表与第二个数据集合并,通过
apply完成标签替换,仅处理符合条件的ID - 第四步:输出或保存处理后的结果
内容的提问来源于stack exchange,提问作者NewUsr
相关产品推荐
相关产品推荐

