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

如何基于ID外连接3个及以上数据集并按列对比分析

多年份DataFrame合并并标记文本一致性

问题描述

现有三个分属不同年份的数据集:

1990年数据集

IDTextYear
101abc1990
102abd1990
103a1990

1991年数据集

IDTextYear
104bc1991
101abc1991
102abe1991

1992年数据集

IDTextYear
104bc1992
105a1992

需要完成以下操作:

  • 合并三个DataFrame,禁止使用内连接,必须保留各年份的新ID及无匹配的旧ID
  • 新增Similar列:标记连续年份中相同ID的Text是否一致;无匹配ID的Similar设为false
  • 若Similar为true,则将该ID的Year更新为较晚的年份

最终期望结果:

IDTextYearSimilar
101abc1991true
102abe1991false
103a1990false
104bc1992true
105a1992false

解决方案

通过以下步骤实现需求:

  1. 纵向合并所有数据集,保留全部数据
  2. 按ID分组,对每组记录按年份排序,检查连续年份的文本一致性
  3. 标记Similar状态,同步更新相似记录的年份,最后去重得到最终结果

代码实现

import pandas as pd

# 创建原始数据集
df1990 = pd.DataFrame({'ID': [101, 102, 103], 'Text': ['abc', 'abd', 'a'], 'Year': [1990]*3})
df1991 = pd.DataFrame({'ID': [104, 101, 102], 'Text': ['bc', 'abc', 'abe'], 'Year': [1991]*3})
df1992 = pd.DataFrame({'ID': [104, 105], 'Text': ['bc', 'a'], 'Year': [1992]*2})

# 合并所有数据,保留全部记录
all_data = pd.concat([df1990, df1991, df1992], ignore_index=True)

# 定义分组处理函数
def process_id_group(group):
    # 按年份升序排序,确保连续年份的记录相邻
    sorted_group = group.sort_values('Year').reset_index(drop=True)
    # 初始化Similar列为False
    sorted_group['Similar'] = False
    
    # 遍历检查连续年份的文本一致性
    for i in range(1, len(sorted_group)):
        if sorted_group['Text'].iloc[i] == sorted_group['Text'].iloc[i-1]:
            sorted_group['Similar'].iloc[i] = True
            # 将前一行的年份更新为当前行的较晚年份
            sorted_group['Year'].iloc[i-1] = sorted_group['Year'].iloc[i]
    
    # 去重:保留同一ID下相同文本的最新记录
    cleaned_group = sorted_group.drop_duplicates(subset=['ID', 'Text'], keep='last')
    return cleaned_group

# 应用分组处理,整理结果
final_result = all_data.groupby('ID').apply(process_id_group).reset_index(drop=True)
# 调整列顺序并按ID排序
final_result = final_result[['ID', 'Text', 'Year', 'Similar']].sort_values('ID').reset_index(drop=True)

print(final_result)

代码说明

  • 合并数据:使用pd.concat纵向合并三个数据集,确保所有ID都被保留,满足非内连接的要求
  • 分组排序:对每个ID的记录按年份排序,便于检查连续年份的文本变化
  • 标记与更新:遍历排序后的组,对比相邻行的文本,一致则标记Similar为True,并将前一行年份更新为当前行的较晚年份
  • 去重整理:去除同一ID下文本重复的记录,保留最新状态;最后调整列顺序并按ID排序,得到符合要求的结果

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.08 04:40:19