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

在Pandas中获取其他列引用的Token值并生成关系列表

解决Pandas DataFrame的实体关系映射问题

我来帮你搞定这个问题!先理清楚你的需求:你有一个包含token和实体关系的DataFrame,需要把每一行关系记录里的entity1、entity2对应的tokenID映射成实际的token,最终生成[sentence, token1, token2, relation]格式的关系列表,就像你给出的示例[1, a, e, A]和[1, c, g, B]那样。

先把你的原始DataFrame还原出来方便参考:

import pandas as pd
data = {
    'sentence': [1,1,1,1,1,1,1,1,1,1],
    'token': ['a','b','c','d','e','f','g','h',None,None],
    'tokenID': [0,1,2,3,4,5,6,7,None,None],
    'entity1': [None,None,None,None,None,None,None,None,0,2],
    'entity2': [None,None,None,None,None,None,None,None,4,6],
    'relation': [None,None,None,None,None,None,None,None,'A','B']
}
df = pd.DataFrame(data)

先说说你现有代码的问题

你写的函数里存在几个明显的问题:

  • 变量名混乱(比如mia没有定义,mi和ba的逻辑关联不清晰)
  • 没有建立sentence + tokenID的唯一映射,直接用isin会导致跨句子的错误匹配(如果有多个sentence的话)
  • 直接给列表元素赋值的方式不符合Python的列表操作逻辑,而且无法批量处理所有关系行

正确的解决思路和代码

核心思路是先建立(sentence, tokenID)到token的映射关系,再针对每一条关系记录完成映射转换:

def generate_relation_list(df):
    # 建立 (sentence, tokenID) → token 的映射字典,确保同句子内的tokenID唯一匹配
    token_map = df.dropna(subset=['tokenID']).set_index(['sentence', 'tokenID'])['token'].to_dict()
    
    # 筛选出所有包含有效关系的行(排除relation为空的行)
    relation_records = df.dropna(subset=['relation'])
    
    # 遍历每条关系记录,生成目标格式的列表
    result = []
    for _, row in relation_records.iterrows():
        # 从映射字典中取出对应token
        token1 = token_map[(row['sentence'], row['entity1'])]
        token2 = token_map[(row['sentence'], row['entity2'])]
        # 组装成目标格式并加入结果列表
        result.append([row['sentence'], token1, token2, row['relation']])
    
    return result

# 调用函数测试
output = generate_relation_list(df)
print(output)
# 输出结果:[[1, 'a', 'e', 'A'], [1, 'c', 'g', 'B']]

如果你喜欢更简洁的写法,可以用apply函数实现:

def generate_relation_list(df):
    token_map = df.dropna(subset=['tokenID']).set_index(['sentence', 'tokenID'])['token'].to_dict()
    relation_records = df.dropna(subset=['relation'])
    
    return relation_records.apply(
        lambda row: [
            row['sentence'],
            token_map[(row['sentence'], row['entity1'])],
            token_map[(row['sentence'], row['entity2'])],
            row['relation']
        ],
        axis=1
    ).tolist()

代码说明

  1. 映射字典token_map:通过复合索引(sentence, tokenID)确保每个tokenID只对应同一句子下的token,避免多sentence场景下的ID冲突。
  2. 筛选关系记录:只处理relation不为空的行,跳过那些纯token的行。
  3. 生成结果:遍历每条关系记录,从映射字典中快速取出对应的token,组装成你需要的格式。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.05.27 07:19:07