我想按数据集和零件列对数据进行分组。如果它们具有相同的部分,则将它们全部组合在一起。请参阅输出列。我想编写一个python脚本来生成输出列显示的内容。
如您所见,集合“ 6”具有部分“ y”,集合7也具有部分“ y”,因此在这种情况下,我要输出为“ y,u”,因为它们共享部分“ y”
我希望这有道理!
答案 0 :(得分:3)
这更像是网络问题
import networkx as nx
G=nx.from_pandas_edgelist(df, 'Set', 'Parts')
l=list(nx.connected_components(G))
c1=[[y for y in x if y in df['Set'].tolist() ]for x in l]
c2=[','.join(set([y for y in x if y in df['Parts'].tolist()]))for x in l]
from collections import ChainMap
df.Set.map(dict(ChainMap(*map(dict.fromkeys, c1, c2))))
Out[167]:
0 f,a,b,c,d,g,e
1 f,a,b,c,d,g,e
2 f,a,b,c,d,g,e
3 f,a,b,c,d,g,e
4 f,a,b,c,d,g,e
5 f,a,b,c,d,g,e
6 f,a,b,c,d,g,e
7 f,a,b,c,d,g,e
8 f,a,b,c,d,g,e
9 f,a,b,c,d,g,e
10 z
11 u,y
12 u,y
13 u,y
Name: Set, dtype: object
答案 1 :(得分:2)
使用networkx
的最小生成树和BFS
g = nx.from_pandas_edgelist(df, source='set', target='parts')
def parse(s):
vals = [item for sub in nx.algorithms.tree.minimum_spanning_edges(s, data=False) for item in sub]
edges = set(filter(lambda x: isinstance(x, int), vals))
vals = sorted(set(filter(lambda x: isinstance(x, str), vals)))
return({k: ','.join(vals) for k in edges})
m = map(parse, nx.connected_component_subgraphs(g))
df.set.map({k: v for x in m for k,v in x.items()})
输出
0 a,b,c,d,e,f,g
1 a,b,c,d,e,f,g
2 a,b,c,d,e,f,g
3 a,b,c,d,e,f,g
4 a,b,c,d,e,f,g
5 a,b,c,d,e,f,g
6 a,b,c,d,e,f,g
7 a,b,c,d,e,f,g
8 a,b,c,d,e,f,g
9 a,b,c,d,e,f,g
10 z
11 u,y
12 u,y
13 u,y
Name: set, dtype: object