Группировать по 2 столбцам одновременно, добавляя некоторые условия в groupby

#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