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

如何在Pandas DataFrame中为存在重叠字符串列表的行设置相同索引

问题分析与解决方案

你的代码主要存在几个问题:

  1. 未提前初始化Index列,直接赋值会导致部分行的Index值在引用时还未生成,引发错误;
  2. 匹配到关联行时,直接取第一个匹配行的Index,逻辑不严谨——可能存在多个关联行,且应该继承最早出现的组索引;
  3. 循环遍历行的方式效率低,且无法处理多步关联的情况(比如行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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 09:00:10