如何在Pandas DataFrame中合并三个数据集并生成拼接结果列?
在Pandas中合并多数据集生成合并结果列的解决方案
问题说明
现有三个数据集:
data_1 = {'ID': ['234', '456', '331', '134','372','456','765'], 'Result': ['A','A','A','A','A','A','A']} data_2 = {'ID': ['456', '132', '098', '134','372','456','234'], 'Result': ['B','B','B','B','B','B','B']} data_3 = {'ID': ['111', '132', '765', '134','234','999','765'], 'Result': ['C','C','C','C','C','C','C']}
需要生成如下结构的目标DataFrame:
new_df = {'ID': ['234', '111', '456', '331','132','999','765'], 'Result': ['ABC','C','AB','A','BC','C','AC']}
尝试左连接合并未得到预期结果,需用Pandas实现类似Excel多次查找的效果。
两种可行解决方案
方案一:纵向合并+分组聚合
这种方式更简洁,适合处理多数据集的合并拼接需求:
- 导入Pandas并转换数据集为DataFrame
import pandas as pd df1 = pd.DataFrame(data_1) df2 = pd.DataFrame(data_2) df3 = pd.DataFrame(data_3)
- 纵向堆叠三个DataFrame
combined_df = pd.concat([df1, df2, df3], ignore_index=True)
- 按ID分组,去重后拼接Result值
用set()去重单个ID的重复Result,sorted()保证字母按顺序排列:
agg_result = combined_df.groupby('ID')['Result'].agg(lambda x: ''.join(sorted(set(x))))
- 转换为目标格式并调整排序
new_df = agg_result.reset_index() # 按ID排序(处理带前导零的ID,若无需可省略key参数) new_df = new_df.sort_values('ID', key=lambda x: x.str.lstrip('0')).reset_index(drop=True)
方案二:多次左连接+列拼接
适合习惯用连接操作的场景:
导入Pandas并转换数据集为DataFrame(同方案一第一步)
依次左连接三个数据集
# 合并df1和df2,保留所有ID merged = df1.merge(df2, on='ID', how='outer', suffixes=('_A', '_B')) # 再合并df3 merged = merged.merge(df3, on='ID', how='outer')
- 拼接非空的Result列值
merged['Result'] = merged[['Result_A', 'Result_B', 'Result']].apply( lambda x: ''.join(sorted([v for v in x if pd.notna(v)])), axis=1 )
- 清理数据并调整格式
new_df = merged[['ID', 'Result']].drop_duplicates().reset_index(drop=True) # 按ID排序 new_df = new_df.sort_values('ID', key=lambda x: x.str.lstrip('0')).reset_index(drop=True)
两种方案最终都会输出与目标一致的结果:
ID Result 0 234 ABC 1 111 C 2 456 AB 3 331 A 4 132 BC 5 999 C 6 765 AC
内容的提问来源于stack exchange,提问作者captmorgan
相关产品推荐
相关产品推荐

