R语言:基于其他列差异提取DataFrame唯一行的需求
解决同一国家内等价政党去重问题
针对你给出的DataFrame,需要在同一国家范围内,对满足以下条件的等价政党行去重:
- 同一国家中,
Country-A-C匹配但B值不同 - 同一国家中,
Country-B-C匹配但A值不同
最终保留每组等价政党中首次出现的行。
实现步骤
这里用pandas结合networkx的连通分量来处理,核心思路是把同一国家内的等价政党行视为连通节点,每个连通组只保留最早出现的行。
1. 准备示例数据
import pandas as pd import networkx as nx # 构造你的原始DataFrame df = pd.DataFrame({ 'Country': ['HONDURAS', 'HONDURAS', 'NICARAGUA', 'CHILE', 'HONDURAS', 'HONDURAS'], 'A': ['PL', 'PN', 'PN', 'PN', 'PNH', 'PNH'], 'B': ['Partido Liberal', 'Partido Nacional de Honduras', 'Partido Nacional', 'Partido Nacional', 'Partido Nacional', 'Partido Nacional de Honduras'], 'C': [12.0, 17.33, 12.0, 17.33, 17.33, 17.33] })
2. 定义去重函数
这个函数会处理单个国家的分组,把等价的行通过图的连通分量归类,然后保留每组的首行:
def deduplicate_party(group): # 创建图,每行的索引作为节点 G = nx.Graph() G.add_nodes_from(group.index) # 遍历行对,为等价行添加连接边 for i in group.index: for j in group.index: if i >= j: continue # 判断是否属于同一等价组:A+C相同 或 B+C相同 if (group.loc[i, 'A'] == group.loc[j, 'A'] and group.loc[i, 'C'] == group.loc[j, 'C']) or \ (group.loc[i, 'B'] == group.loc[j, 'B'] and group.loc[i, 'C'] == group.loc[j, 'C']): G.add_edge(i, j) # 提取每个连通组的首个索引(最早出现的行) unique_indices = [] for component in nx.connected_components(G): unique_indices.append(min(component)) # 返回去重后的分组,保持原顺序 return group.loc[unique_indices].sort_index()
3. 分组应用去重并输出结果
按Country分组后应用函数,得到最终结果:
result = df.groupby('Country', group_keys=False).apply(deduplicate_party) print(result)
输出结果:
Country A B C 0 HONDURAS PL Partido Liberal 12.00 1 HONDURAS PN Partido Nacional de Honduras 17.33 2 NICARAGUA PN Partido Nacional 12.00 3 CHILE PN Partido Nacional 17.33
补充说明
- 不同国家的同名政党、同
C值政党会被保留,因为分组是按Country进行的 - 连通分量的方式能准确识别所有间接关联的等价行(比如HONDURAS的PN和PNH,通过B值关联成同一组)
内容的提问来源于stack exchange,提问作者flâneur
相关产品推荐
相关产品推荐

