You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

如何对数据集相似行分组?多关联数据集合并方法咨询(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

火山引擎 最新活动