基于自定义重复判定规则的Pandas数据合并实现问询
解决方案:自定义重复规则的Pandas数据合并
前置依赖
先安装所需工具库:
pip install python-Levenshtein networkx
完整实现代码
import pandas as pd import Levenshtein import networkx as nx # 加载数据(替换成你的CSV读取代码:pd.read_csv("your_file.csv")) data = { 'English': ["'hello'", "'helo'", "'hello'", "'hallo'"], 'Spanish': ["'hola'", "'hola'", "'hola_a'", "'a_aureola'"], 'Count': [23, 2, 1, 1], 'AF': [0, 1, 0, 1] } df = pd.DataFrame(data) # 实现自定义重复项判定逻辑 def is_duplicate(row1, row2, edit_dist_threshold=1): # 去除文本中的引号,方便后续处理 eng1 = row1['English'].strip("'") eng2 = row2['English'].strip("'") spa1 = row1['Spanish'].strip("'") spa2 = row2['Spanish'].strip("'") # 规则1:English编辑距离达标 + Spanish完全匹配 if spa1 == spa2 and Levenshtein.distance(eng1, eng2) < edit_dist_threshold: return True # 规则2:English完全匹配 + Spanish拆分后有交集 elif eng1 == eng2: spa_parts1 = set(spa1.split('_')) spa_parts2 = set(spa2.split('_')) if len(spa_parts1 & spa_parts2) > 0: return True # 规则3:其余情况不判定为重复 return False # 用图结构处理传递性重复(比如行0和1重复、行0和2重复,则三行同属一组) G = nx.Graph() G.add_nodes_from(df.index) # 遍历行对,标记重复关联 for i in df.index: for j in df.index[i+1:]: if is_duplicate(df.loc[i], df.loc[j]): G.add_edge(i, j) # 生成分组映射:把同一连通分量的行归为一组 group_mapping = {} for group_id, nodes in enumerate(nx.connected_components(G)): for node in nodes: group_mapping[node] = group_id df['group_id'] = df.index.map(group_mapping) # 分组聚合:保留每组首行的前两列,其余数值列求和 result = df.groupby('group_id').agg( English=('English', 'first'), Spanish=('Spanish', 'first'), **{col: (col, 'sum') for col in df.columns if col not in ['English', 'Spanish', 'group_id']} ).reset_index(drop=True) print(result)
代码说明
- 重复判定:严格对应你给出的三条规则,编辑距离阈值可根据实际需求调整。
- 连通分量分组:解决了重复关系的传递性问题,避免遗漏关联行,比单纯两两遍历合并更高效准确。
- 聚合逻辑:完全按照要求保留每组第一行的语言列,其余数值列自动求和。
输出结果
English Spanish Count AF 0 'hello' 'hola' 26 1 1 'hallo' 'a_aureola' 1 1
内容的提问来源于stack exchange,提问作者tigerninjaman
相关产品推荐
相关产品推荐

