Merge Duplicate Group
merge_duplicate_group · duplicates · any
2026-09-24
กำลังประมวลผล…
merge_duplicate_group · duplicates · any
2026-09-24
remove_duplicate_by_column เลือกแถวใดแถวหนึ่งไว้แล้วทิ้งที่เหลือ ซึ่งแปลว่าข้อมูลดี ๆ ในแถวที่ถูกทิ้งหายไปด้วย เทคนิคนี้ต่างออกไป คือยุบทั้งกลุ่มเป็นแถวเดียวโดย ดึงค่าที่ดีที่สุดจากทุกแถวมารวมกัน ลูกค้าคนเดียวที่มีสามแถวจึงได้แถวเดียวที่ข้อมูลครบที่สุด
sumfind_fuzzy_duplicates ตรวจก่อนkeyColumns โดยแยกชนิดข้อมูลrulefirst_non_null เอาค่าแรกที่ไม่ว่าง · longest เอาค่าที่ยาวที่สุด (ดีกับที่อยู่หรือหมายเหตุ) · sum บวกค่าตัวเลขทั้งกลุ่มsum กับคอลัมน์ที่บวกไม่ได้จะถอยไปใช้ค่าแรกที่ไม่ว่าง แทนที่จะทำให้เป็นค่าว่าง| Parameter | Type | Default |
|---|---|---|
keyColumns | string[] | — |
rule | first_non_null | longest | sum | "first_non_null" |
import json
def combine(values, rule):
present = [v for v in values if v is not None]
if not present:
return None
if rule == 'longest':
return max(present, key=lambda v: len(str(v)))
if rule == 'sum':
if all(isinstance(v, (int, float)) and not isinstance(v, bool) for v in present):
return sum(present)
return present[0]
return present[0]
def merge_duplicate_group(rows, key_columns, rule='first_non_null'):
groups = {}
for row in rows:
key = json.dumps([row.get(c) for c in key_columns], ensure_ascii=False)
groups.setdefault(key, []).append(row)
merged = []
for members in groups.values():
winner = dict(members[0])
for column in winner:
if column in key_columns:
continue
winner[column] = combine([member.get(column) for member in members], rule)
merged.append(winner)
return merged
rows = [
{'email': 'a@x.com', 'name': 'A', 'note': None, 'spend': 10},
{'email': 'a@x.com', 'name': 'Alexander', 'note': 'ไทย', 'spend': 5},
{'email': 'b@x.com', 'name': 'B', 'note': None, 'spend': 7},
]
print(json.dumps(merge_duplicate_group(rows, ['email']), ensure_ascii=False))
ฐานลูกค้าที่รวมจากเว็บและหน้าร้านมีอีเมลซ้ำ 312 อีเมล แถวจากเว็บมีเบอร์โทร แถวจากหน้าร้านมีที่อยู่ ใช้ keyColumns เป็น email และ rule เป็น first_non_null จะได้แถวเดียวที่มีทั้งเบอร์และที่อยู่ ถ้าต้องการยอดซื้อรวมด้วย ให้เพิ่มขั้นตอนที่สองด้วย rule เป็น sum เฉพาะตอนที่คอลัมน์ยอดเป็นตัวเลขแล้ว
ใช้ find_fuzzy_duplicates ตรวจก่อนว่ากลุ่มถูกต้อง ใช้ remove_duplicate_by_column เมื่อไม่ต้องรวมค่า และใช้ fill_missing หลังยุบกลุ่มถ้ายังมีช่องว่างเหลือ