如何基于ID外连接3个及以上数据集并按列对比分析
多年份DataFrame合并并标记文本一致性
问题描述
现有三个分属不同年份的数据集:
1990年数据集
| ID | Text | Year |
|---|---|---|
| 101 | abc | 1990 |
| 102 | abd | 1990 |
| 103 | a | 1990 |
1991年数据集
| ID | Text | Year |
|---|---|---|
| 104 | bc | 1991 |
| 101 | abc | 1991 |
| 102 | abe | 1991 |
1992年数据集
| ID | Text | Year |
|---|---|---|
| 104 | bc | 1992 |
| 105 | a | 1992 |
需要完成以下操作:
- 合并三个DataFrame,禁止使用内连接,必须保留各年份的新ID及无匹配的旧ID
- 新增
Similar列:标记连续年份中相同ID的Text是否一致;无匹配ID的Similar设为false - 若
Similar为true,则将该ID的Year更新为较晚的年份
最终期望结果:
| ID | Text | Year | Similar |
|---|---|---|---|
| 101 | abc | 1991 | true |
| 102 | abe | 1991 | false |
| 103 | a | 1990 | false |
| 104 | bc | 1992 | true |
| 105 | a | 1992 | false |
解决方案
通过以下步骤实现需求:
- 纵向合并所有数据集,保留全部数据
- 按ID分组,对每组记录按年份排序,检查连续年份的文本一致性
- 标记
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
相关产品推荐
相关产品推荐

