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