如何合并名称相似后缀不同的数据集行?NetSuite/Python实现
解决方案
一、NetSuite 搜索实现方案
NetSuite 可通过自定义公式字段+分组汇总实现需求,步骤如下:
1. 添加自定义公式字段
在搜索结果中新增两个公式字段:
- 前缀公式(文本型):提取主Item名称,处理X/Y/Z后缀的情况
CASE WHEN REGEXP_SUBSTR({name}, '-[XYZ]$') IS NOT NULL THEN SUBSTR({name}, 1, LENGTH({name})-2) ELSE {name} END - 后缀公式(文本型):标记后缀类型,非X/Y/Z的记录标记为
MainCASE WHEN REGEXP_SUBSTR({name}, '-[XYZ]$') IS NOT NULL THEN REGEXP_SUBSTR({name}, '[XYZ]$') ELSE 'Main' END
2. 配置分组与汇总规则
- 搜索结果标签页中,将「前缀公式」设为分组字段,同时保留原
Name和Description(选择取每组第一条记录的对应值) - 对
Onhand字段添加4个汇总公式:- Available:
SUM(CASE WHEN {custformula_suffix} = 'Main' THEN {onhand} ELSE 0 END) - Available-X:
SUM(CASE WHEN {custformula_suffix} = 'X' THEN {onhand} ELSE 0 END) - Available-Y:
SUM(CASE WHEN {custformula_suffix} = 'Y' THEN {onhand} ELSE 0 END) - Available-Z:
SUM(CASE WHEN {custformula_suffix} = 'Z' THEN {onhand} ELSE 0 END)
- Available:
3. 调整列顺序
将汇总后的列调整为目标输出的顺序,即可得到所需结果。
二、Python Pandas 实现方案
若NetSuite搜索无法满足需求,可通过Pandas高效处理:
1. 加载原始数据
import pandas as pd data = [ ["ItemA", "aaaa-bb", 1], ["ItemA-X", "aaaa-bb-x", 3], ["ItemA-Y", "aaaa-bb-y", 1], ["ItemA-Z", "aaaa-bb-z", 2], ["ItemB", "bbbb-00", 0], ["ItemB-X", "bbbb-00-x", 3], ["ItemB-Y", "bbbb-00-y", 0], ["ItemC-X", "cccc-01-x", 2], ["ItemD-D", "ddd-01-d", 2], ] df = pd.DataFrame(data, columns=["Name", "Description", "Onhand"])
2. 拆分前缀与后缀
# 提取后缀(仅匹配-X/-Y/-Z) df["Suffix"] = df["Name"].str.extract(r'-([XYZ])$', expand=False).fillna("Main") # 提取前缀 df["Prefix"] = df.apply(lambda row: row["Name"][:-2] if row["Suffix"] != "Main" else row["Name"], axis=1)
3. 透视表转换与合并
# 按前缀和后缀汇总Onhand值 pivot = df.pivot_table(index="Prefix", columns="Suffix", values="Onhand", aggfunc="sum", fill_value=0) # 重命名列 pivot = pivot.rename(columns={ "Main": "Available", "X": "Available-X", "Y": "Available-Y", "Z": "Available-Z" }) # 合并原表的基础信息(取每组第一条记录) main_info = df.drop_duplicates("Prefix", keep="first")[["Prefix", "Name", "Description"]] result = main_info.merge(pivot, on="Prefix").drop("Prefix", axis=1)
4. 调整列顺序并输出
# 匹配目标列顺序 result = result[["Name", "Description", "Available", "Available-X", "Available-Y", "Available-Z"]] print(result.to_markdown(index=False))
内容的提问来源于stack exchange,提问作者yumpo
相关产品推荐
相关产品推荐

