Pandas按含共同元素的列表分组后,如何聚合count列?
解决思路与代码实现
你的核心需求是将有共同元素的列表行分组,同时聚合count列。原代码已经通过NetworkX正确识别了连通分组,只需补充count的聚合逻辑即可,具体步骤如下:
- 保留原始行的
id与count对应关系,避免explode后重复计算count - 基于连通分量建立
id到组号的映射 - 回到原始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
相关产品推荐
相关产品推荐

