如何基于数据表某一列的子串合并符合条件的同类行?
零件数据合并需求实现方案
方案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字段完全一致,可合并 - 筛选处理:
- 筛选可合并为TRUE的行,保留唯一前缀对应的行,将Part Num替换为前缀值即可
- 筛选可合并为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
相关产品推荐
相关产品推荐

