You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Pandas按含共同元素的列表分组后,如何聚合count列?

解决思路与代码实现

你的核心需求是将有共同元素的列表行分组,同时聚合count列。原代码已经通过NetworkX正确识别了连通分组,只需补充count的聚合逻辑即可,具体步骤如下:

  1. 保留原始行的id与count对应关系,避免explode后重复计算count
  2. 基于连通分量建立id到组号的映射
  3. 回到原始DataFrame,按组号聚合lot为元素集合、count为求和值

完整代码:

import pandas as pd
import networkx as nx

data = {'lot': [['6309025'],
                   ['6309025', '6375538', '6375540'],
                   ['6410558'], ['6314113']],
        'count': [1, 2, 3, 3]}

df = pd.DataFrame(data)

# 为每行添加唯一id
df['id'] = df.index

# 拆分lot列用于构建图
df_exploded = df.explode('lot')

# 构建lot与行id的关联图,找到连通分量
G = nx.from_pandas_edgelist(df_exploded, 'lot', 'id')
connected_components = list(nx.connected_components(G))

# 建立行id到组号的映射(只保留id节点,排除lot字符串)
group_mapping = {}
for group_idx, comp in enumerate(connected_components):
    for node in comp:
        if isinstance(node, int):
            group_mapping[node] = group_idx

# 为原始数据添加组标识
df['group'] = df['id'].map(group_mapping)

# 分组聚合:合并lot为集合,count求和
result = df.groupby('group').agg(
    lot=('lot', lambda x: set().union(*x)),
    count=('count', 'sum')
).reset_index(drop=True)

print(result)

代码说明

  • 用nx.connected_components识别所有共享lot元素的行组,确保有共同元素的行被分到同一组
  • 聚合lot时用set().union(*x)合并组内所有列表的元素,自动去重
  • 聚合count时直接对组内原始count值求和,避免explode后的重复计算

运行结果:

lot  count
0  {6309025, 6375538, 6375540}      3
1                      {6410558}      3
2                      {6314113}      3

注:你提供的预期输出中第一个组包含6410558应为笔误,原始数据中该元素与其他组无交集,会单独成组。

内容的提问来源于stack exchange,提问作者DouxDoux

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 18:53:13