我有一个熊猫数据框,如图所示数据框中还有许多列不是此任务所必需的。

sentence  token     tokenID    entity1     entity2    relation
   1         a          0         NaN        NaN       NaN
   1         b          1         NaN        NaN       NaN
   1         c          2         NaN        NaN       NaN
   1         d          3         NaN        NaN       NaN
   1         e          4         NaN        NaN       NaN
   1         f          5         NaN        NaN       NaN
   1         g          6         NaN        NaN       NaN
   1         h          7         NaN        NaN       NaN
   1        NaN        NaN         0          4         A
   1        NaN        NaN         2          6         B

所有具有相同句子值的标记都属于同一个句子。
下面两行包含有关句子的信息entity1(和entity2)中的值表示相关的tokenID。在本例中entity1=0,这意味着相关令牌是具有tokenID=0的令牌。
现在我要返回一个列表,其中包含框架中的每个关系:
[sentence, token1, token2, relation]

在我的例子中的意思是:
[1, a, e, A] and [1, c, g, B]

我试着写一个函数:
def sol():
    op = [sentence, entity1, entity2, relations]
    mi = df[["sentence","entity1","entity2"]]
    ba = df.loc[df.sentence.isin(mi.sentence) & df.tokenID.isin(mia.entity1)]
    ba2 = df.loc[df.sentence.isin(mi.sentence) & df.tokenID.isin(mia.entity2)]
    op[1] = ba.token
    op[2] = ba2.token

但没有按我的计划进行。
有什么想法吗?

最佳答案

您可以使用pandas.merge首先将数据集分成两部分-
令牌映射
关系
然后将关系与令牌映射合并以获得所需的输出-

df_token_map = df[df['token'].notnull()][['sentence', 'token', 'tokenID']]
df_relation_map = df[df['relation'].notnull()][['sentence', 'entity1', 'entity2', 'relation']]

df_relation_map = df_relation_map.rename(index=str, columns={'entity1' : 'tokenID'}).merge(df_token_map.rename(index=str, columns={'token':'entity1'}), on=['sentence','tokenID'], how='left').drop('tokenID', axis=1)

df_relation_map = df_relation_map.rename(index=str, columns={'entity2' : 'tokenID'}).merge(df_token_map.rename(index=str, columns={'token':'entity2'}), on=['sentence','tokenID'], how='left').drop('tokenID', axis=1)
df_relation_map[['sentence', 'entity1', 'entity2', 'relation']]

07-26 05:58