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

如何基于数据表某一列的子串合并符合条件的同类行?

零件数据合并需求实现方案

方案1:使用Excel/Google Sheets实现

  • 新增辅助列提取Part Num前6位:假设Part Num在B列,在空白列第2行输入公式=LEFT(B2,6),设置表头为前缀,下拉填充所有行
  • 新增辅助列判断是否可合并:再新增一列,输入公式=COUNTIFS(G:G,G2,C:C,C2,D:D,D2,E:E,E2,F:F,F2)=COUNTIF(G:G,G2)(G列为前缀列,C-F为Thing1-Thing4列),返回TRUE代表同前缀下所有行的Thing字段完全一致,可合并
  • 筛选处理:
    1. 筛选可合并为TRUE的行,保留唯一前缀对应的行,将Part Num替换为前缀值即可
    2. 筛选可合并为FALSE的行,全部保留,Part Num维持原值
  • 将两部分结果合并去重即可得到最终表

方案2:使用Python Pandas实现

import pandas as pd

# 读取原始数据,本地文件可以用pd.read_excel替换
df = pd.read_excel("零件数据表.xlsx")

# 提取Part Num前6位作为分组前缀
df["prefix"] = df["Part Num"].str[:6]
thing_cols = ["Thing1", "Thing2", "Thing3", "Thing4"]

# 分组处理逻辑
def handle_group(group):
    # 检查同前缀下所有Thing列是否完全一致
    if group[thing_cols].nunique().sum() == 4:
        # 全一致则合并为1行,Part Num替换为前缀
        res = group.iloc[0].copy()
        res["Part Num"] = res["prefix"]
        return res.to_frame().T
    # 不一致则返回原分组所有行
    return group

# 执行处理,删除辅助列并重置索引
result = df.groupby("prefix", group_keys=False).apply(handle_group).drop("prefix", axis=1).reset_index(drop=True)

# 导出结果
print(result)
# result.to_excel("处理后零件表.xlsx", index=False)

方案3:使用SQL实现(支持MySQL8.0+/PostgreSQL/BigQuery等)

假设原始表名为parts,查询语句如下:

WITH part_with_prefix AS (
    SELECT 
        *,
        LEFT(`Part Num`, 6) AS prefix,
        -- 统计同前缀下Thing字段组合的唯一值数量
        COUNT(DISTINCT CONCAT(Thing1, '|', Thing2, '|', Thing3, '|', Thing4)) OVER (PARTITION BY LEFT(`Part Num`, 6)) AS unique_thing_count
    FROM parts
)
SELECT 
    Part,
    CASE WHEN unique_thing_count = 1 THEN prefix ELSE `Part Num` END AS `Part Num`,
    Thing1, Thing2, Thing3, Thing4
FROM part_with_prefix
-- 可合并的组只保留1行,不可合并的组保留所有行
QUALIFY (unique_thing_count = 1 AND ROW_NUMBER() OVER (PARTITION BY prefix ORDER BY `Part Num`) = 1) OR unique_thing_count != 1;

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 06:18:04