如何在Pandas DataFrame中为存在重叠字符串列表的行设置相同索引
问题分析与解决方案
你的代码主要存在几个问题:
- 未提前初始化
Index列,直接赋值会导致部分行的Index值在引用时还未生成,引发错误; - 匹配到关联行时,直接取第一个匹配行的
Index,逻辑不严谨——可能存在多个关联行,且应该继承最早出现的组索引; - 循环遍历行的方式效率低,且无法处理多步关联的情况(比如行0和行3关联,行3和行1关联,此时行1也应该和行0同组)。
要实现这个需求,本质是找连通分量:把每行看作一个节点,只要两行有共同爱好就连一条边,同一个连通分量里的行使用相同的组索引(比如分量中最小的原索引)。
实现代码
import pandas as pd import networkx as nx # 创建示例数据 data = {'Name': ['Alice', 'Bob', 'Charlie', 'David', 'Emily'], 'Hobbies': [['reading', 'hiking', 'painting'], ['swimming', 'biking'], ['cooking', 'dancing'], ['reading', 'swimming'], ['hiking', 'painting']]} df = pd.DataFrame(data) # 1. 构建爱好到行索引的映射 hobby_to_indices = {} for idx, hobbies in df['Hobbies'].items(): for h in hobbies: if h not in hobby_to_indices: hobby_to_indices[h] = [] hobby_to_indices[h].append(idx) # 2. 构建图:有共同爱好的行之间连边 G = nx.Graph() G.add_nodes_from(df.index) for indices in hobby_to_indices.values(): # 同一爱好对应的所有行两两相连 for i in range(len(indices)): for j in range(i+1, len(indices)): G.add_edge(indices[i], indices[j]) # 3. 找到所有连通分量,为每个分量分配最小索引作为组索引 group_indices = {} for component in nx.connected_components(G): min_idx = min(component) for idx in component: group_indices[idx] = min_idx # 4. 添加到DataFrame中 df['Index'] = df.index.map(group_indices) print(df)
代码说明
- 先建立爱好和行索引的映射,方便快速找到有相同爱好的行;
- 用图结构把所有有共同爱好的行连接起来,连通分量就是一组需要共享索引的行;
- 每个连通分量取最小的原索引作为组索引,保证逻辑统一;
- 这种方式能处理多步关联的情况,比如示例中Alice(行0)、David(行3)、Bob(行1)会被归为同一组,索引为0;Emily(行4)和Alice(行0)有共同爱好,也归为索引0;Charlie(行2)无关联,索引为2。
运行结果
Name Hobbies Index 0 Alice [reading, hiking, painting] 0 1 Bob [swimming, biking] 0 2 Charlie [cooking, dancing] 2 3 David [reading, swimming] 0 4 Emily [hiking, painting] 0
内容的提问来源于stack exchange,提问作者Veera Silamban
相关产品推荐
相关产品推荐

