在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()
代码说明
- 映射字典
token_map:通过复合索引(sentence, tokenID)确保每个tokenID只对应同一句子下的token,避免多sentence场景下的ID冲突。 - 筛选关系记录:只处理
relation不为空的行,跳过那些纯token的行。 - 生成结果:遍历每条关系记录,从映射字典中快速取出对应的token,组装成你需要的格式。
内容的提问来源于stack exchange,提问作者Mi.
相关产品推荐
相关产品推荐

