我有一个数据框,其中 1 列包含列表元素,1 列包含整数。我想对至少有一个共同元素的所有列表进行分组,然后聚合另一列。
import pandas as pd
import json
import networkx as nx
data = {'lot': [['6309025'],
['6309025', '6375538', '6375540'],
['6410558'], ['6314113']],
'count': [1, 2, 3, 3]}
df = pd.DataFrame(data)
df['id'] = df.index
df = df.explode('lot')
G = nx.from_pandas_edgelist(df, 'lot', 'id')
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.id.map(d)).lot.apply(set)
我使用了这个问题中的解决方案。但是,我找不到聚合
count
列的方法。
预期输出:
lot count
0 {6309025, 6410558, 6375540, 6375538} 3
1 {6410558} 3
2 {6314113} 3
有什么想法吗?
您可以屏蔽分解的 DataFrame 中的重复值,为每个连接的组件创建一个唯一的石斑鱼,然后聚合:
import networkx as nx
tmp = df.explode('lot')
G = nx.from_pandas_edgelist(tmp.reset_index(), source='lot', target='index')
S = set(tmp['lot'])
mapper = {n: i for i, c in enumerate(nx.connected_components(G))
for n in c if n in S}
out = (tmp
.assign(count=lambda x: x['count'].mask(x.index.duplicated(), 0))
.groupby(tmp['lot'].map(mapper), as_index=False)
.agg({'lot': set, 'count': 'sum'})
)