У меня есть колонка панд со списками. Группировать строки, содержащие хотя бы один общий элемент из одного столбца - PullRequest
2 голосов
/ 14 октября 2019

У меня есть панды df с 1 столбцом со списками. Я хотел бы сгруппировать все списки, которые имеют хотя бы один общий элемент.

Input Df :
> 
    Category
 0  [IAB19, IAB81, IAB82]
 1  [IAB25, IAB27]
 2  [IAB19, IAB20]
 3  [IAB22, IAB55, IAB56, IAB58]
 4  [IAB81, IAB89]
 5  [IAB82, IAB95]

Я хочу выяснить, присутствуют ли какие-либо коды в df ['Category'] в любой другой строке df ['Категория '].

И если да, я бы хотел объединить эти списки с общим хотя бы одним элементом.

Ожидаемый результат:

    Category
 0  [IAB19, IAB81, IAB82, IAB20, IAB89, IAB95]
 1  [IAB25, IAB27]
 2  [IAB22, IAB55, IAB56, IAB58]

Есть мысли?

1 Ответ

3 голосов
/ 14 октября 2019

Это скрытая проблема с сетью, поэтому мы можем попробовать networkx, но перед этим вам может потребоваться explode весь столбец списка в один элемент строки (функция доступна после pandas 0.25)

import networkx as nx
df['Key']=df.index
df=df.explode('Category')
G=nx.from_pandas_edgelist(df, 'Category', 'Key')
l=list(nx.connected_components(G))
L=[dict.fromkeys(y,x) for x, y in enumerate(l)]
d={k: v for d in L for k, v in d.items()}
s=df.groupby(df.Key.map(d)).Category.apply(set)
s
Key
0    {IAB89, IAB82, IAB19, IAB95, IAB81, IAB20}
1                                {IAB27, IAB25}
2                  {IAB55, IAB56, IAB22, IAB58}
Name: Category, dtype: object
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...