Python 如果共享单元格值,则合并行

Python 如果共享单元格值,则合并行,python,excel,vba,Python,Excel,Vba,我正在创建一个csv,它将作为任何给定名称的可接受昵称的参考。然后,我获取一个输入名称,查看每一行是否存在该名称,然后返回该行中的所有其他单元格,即昵称。输入名称不必位于第一列中,即可返回结果。然而,我从几个不同的来源创建了这个列表,现在我有了重复的。 如果任何单元格匹配,是否有方法合并每一行 Excel/VBA/Python中的解决方案将非常好 csv中的示例行: a b c d steven steve abigail abby ab

我正在创建一个csv,它将作为任何给定名称的可接受昵称的参考。然后,我获取一个输入名称,查看每一行是否存在该名称,然后返回该行中的所有其他单元格,即昵称。输入名称不必位于第一列中,即可返回结果。然而,我从几个不同的来源创建了这个列表,现在我有了重复的。 如果任何单元格匹配,是否有方法合并每一行

Excel/VBA/Python中的解决方案将非常好

csv中的示例行:

a       b       c       d
steven  steve       
abigail abby    abby    gail
stephen steve   steph   
abraham ab      abe 
期望输出:

a       b       c       d
steven  steve  stephen  steph   
abigail abby    abby    gail
abraham ab      abe 

我提出的解决方案乍一看似乎不寻常,但它确实有效

如果两个名称是相互可接受的昵称,则可以在其中建立名称图。图的连接组件是所有相互接受的昵称的组

首先导入
networkx
(网络操作模块)和其他支持工具:

import networkx as nx
from itertools import combinations, chain
以下是CSV文件中的列表:

names = [['steven', 'steve'], ['abigail', 'abby', 'abby', 'gail'],
         ['stephen', 'steve', 'steph'], ['abraham', 'ab', 'abe']]
通过将每个子列表中的每个名称与同一子列表中的其他名称连接,创建边列表:

edges = chain.from_iterable(combinations(set(n), 2) for n in names)
从边列表构造一个图形:

G = nx.Graph(edges)
识别连接的组件:

[list(n) for n in nx.connected_components(G)]
#[['stephen', 'steph', 'steven', 'steve'],
# ['gail', 'abigail', 'abby'], 
# ['abe', 'ab', 'abraham']]

第三排有两个“艾比”。可能是个错误。太棒了,谢谢!我所做的一个改变是使用itertools方法combinations_替换_,而不是combination,因为我有一些1个单元格行。