如何对数据集相似行分组?多关联数据集合并方法咨询(Python/Pandas)
1. 如何在数据集中对相似行进行分组?
首先得明确**“相似行”的定义**——通常是指某几列(比如唯一标识列,像项目ID)的值完全相同的行。用Pandas的groupby就能轻松搞定,核心思路是先指定分组的依据列,再对其他列做聚合处理。
举个实战例子:假设你的数据集里有多个行对应同一个项目,我们按项目ID分组,把每个项目的所有相关信息聚合起来:
import pandas as pd # 示例数据集 data = { "项目ID": ["P001", "P001", "P002", "P002"], "属性A": ["值1", "值1_版本2", "值3", "值3"], "属性B": ["描述X", "描述X_更新版", "描述Y", "描述Y"] } df = pd.DataFrame(data) # 按项目ID分组,把每个属性的所有版本收集成列表 grouped_df = df.groupby("项目ID").agg(lambda x: list(x)).reset_index() print(grouped_df)
输出会是每个项目对应一个行,属性A和属性B列里是该项目所有的版本值,这样就把相似行(同项目ID)归到了一组。如果只想保留不重复的版本,把list(x)改成pd.unique(x).tolist()就行(比用集合更能保留原始顺序)。
2. 合并多个含差异信息的数据集(保留所有版本)
你提到的场景我经常碰到,核心思路是先合并所有数据集,再按项目分组聚合,比单纯的列拼接更灵活,能完美保留所有数据版本。给你一套实战可直接用的方案:
步骤1:加载并标记各个数据集
先给每个数据集加一个来源列,方便后续追踪每个数据版本来自哪个原始数据集——这一步看似多余,但实际排查数据时特别有用:
# 示例数据集b df_b = pd.DataFrame({ "项目ID": ["P001", "P002"], "属性A": ["值1", "值3"], "属性B": ["描述X", "描述Y"] }) df_b["来源"] = "数据集b" # 示例数据集c df_c = pd.DataFrame({ "项目ID": ["P001", "P001", "P002"], "属性A": ["值1_版本2", "值1_版本3", "值3_更新版"], "属性B": ["描述X_更新版", "描述X_最终版", "描述Y"] }) df_c["来源"] = "数据集c"
步骤2:合并所有数据集
用pd.concat把多个数据集纵向合并成一个大的DataFrame,不管列有没有差异,Pandas会自动给缺失的列补NaN:
combined_df = pd.concat([df_b, df_c], ignore_index=True)
步骤3:按项目分组,保留所有版本信息
现在按项目ID分组,把每个属性的所有版本(包括来源)都聚合起来,就能清晰看到每个项目的全量数据版本了:
# 聚合时保留所有值,包括来源信息 final_df = combined_df.groupby("项目ID").agg({ "属性A": lambda x: list(x), "属性B": lambda x: list(x), "来源": lambda x: list(x) }).reset_index() print(final_df)
输出结果里,每个项目的属性A、属性B会包含所有原始数据里的版本,来源列能告诉你每个版本来自哪个数据集,完全满足“差异处保留所有版本”的需求。
额外优化:如果想把版本展开成多行(可选)
要是你不想把版本放到列表里,而是每个版本单独一行(方便逐个查看),直接用合并后的combined_df就行,不用分组:
# 按项目ID排序,直观查看所有版本 print(combined_df.sort_values("项目ID"))
内容的提问来源于stack exchange,提问作者matmaxgeds




