Доступ к значениям, на которые ссылаются другие столбцы в пандах - PullRequest
0 голосов
/ 11 мая 2018

У меня есть кадр данных панд, как показано здесь.В кадре данных есть еще много столбцов, которые не нужны для этой задачи.

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

Все токены с одинаковым значением для предложения принадлежат одному и тому же предложению.

В двух строках ниже содержится информация о предложениях.Значения в entity1entity2) представляют соответствующие 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

но это не сработало, как я планировал.

Есть идеи?

Ответы [ 3 ]

0 голосов
/ 11 мая 2018

Это один путь через 2 самостоятельных слияния.

res = df.loc[:, ['entity1', 'entity2', 'relation']].dropna()\
        .merge(df[['sentence', 'token', 'tokenID']].dropna(),
               how='left', left_on='entity1', right_on='tokenID')\
        .merge(df[['sentence', 'token', 'tokenID']].dropna(),
               how='left', left_on='entity2', right_on='tokenID')

lst = res[['sentence_x', 'token_x', 'token_y', 'relation']].values.tolist()

[[1, 'a', 'e', 'A'],
 [1, 'c', 'g', 'B']]

Обратите внимание, что не ясно, что именно вы хотите в случае нескольких предложений.

0 голосов
/ 11 мая 2018

1.создать карту для токена и идентификатора токена

2.заменить для столбцов сущности

попробуйте это,

df_temp=df[df['token'].isnull()] 
df_temp=df_temp[['sentence','entity1','entity2','relation']]
z=df[df['token'].notnull()]
dic=dict(zip(z['tokenID'],z['token']))#creaing dictionary
df_temp['entity1']=df_temp['entity1'].map(dic) #mapping 
df_temp['entity2']=df_temp['entity2'].map(dic) #mapping 
print df_temp.values

Вывод

[[1 'a' 'e' 'A']

[1 'c' 'g' 'B']]

0 голосов
/ 11 мая 2018

Вы можете использовать pandas.merge. Сначала разбейте ваш набор данных на две части -

  1. Token Mapping
  2. Отношения

Затем объедините отношения с сопоставлением токенов, чтобы получить желаемый результат -

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']]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...