对列表中至少包含同一列中的一个公共元素的行进行分组,并聚合其他列

问题描述 投票:0回答:1

我有一个数据框,其中 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

有什么想法吗?

python pandas dataframe group-by
1个回答
0
投票

您可以屏蔽分解的 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'})
      )
© www.soinside.com 2019 - 2024. All rights reserved.