#python #pandas
#python #pandas
Вопрос:
Я хочу сгруппировать свои данные по столбцам set и parts. Если они имеют одинаковые части, то сгруппируйте их все вместе. Пожалуйста, посмотрите столбец вывода. Я хочу написать скрипт на Python, чтобы генерировать именно то, что показывает столбец вывода.
Как вы можете видеть, набор «6» имеет часть «y», а набор 7 также имеет часть «y», поэтому в этом случае я хочу, чтобы вывод был «y, u», потому что они разделяют часть «y».
Я надеюсь, что это имеет смысл!
Комментарии:
1. к сожалению, эта группировка не имеет смысла для меня: ( может быть, вы можете объяснить немного больше ..?
2. например, почему первая строка
1,a
имеет этот выводa,b,c,d,e,f,g
? Мне это непонятно
Ответ №1:
Это больше похоже на сетевую проблему
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. Я тоже направлялся по этому маршруту. Тем не менее, мне нужно освежить мои методы сбора ‘ChainMap’. 🙂
2. Спасибо!! Вот почему я люблю сообщество stackoverflow Python! Вы, ребята, очень полезны. Я застрял с этим в течение нескольких дней!!!
3. @Sotra yw:-) счастливого кодирования 🙂
Ответ №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