同时按2列分组,同时为分组依据添加一些条件

时间:2019-04-23 18:49:32

标签: python pandas

我想按数据集和零件列对数据进行分组。如果它们具有相同的部分,则将它们全部组合在一起。请参阅输出列。我想编写一个python脚本来生成输出列显示的内容。

enter image description here

如您所见,集合“ 6”具有部分“ y”,集合7也具有部分“ y”,因此在这种情况下,我要输出为“ y,u”,因为它们共享部分“ y”

我希望这有道理!

2 个答案:

答案 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