Объединение строк в фрейме данных - PullRequest
0 голосов
/ 02 июня 2018

У меня есть DF, который имеет результаты классификатора NER, такие как:

df =

s        token        pred       tokenID
17     hakawati       B-Loc         3
17     theatre        L-Loc         3
17     jerusalem      U-Loc         7
56     university     B-Org         5
56     of             I-Org         5
56     texas          I-Org         5
56     here           L-Org         6
...
5402   dwight         B-Peop        1    
5402   d.             I-Peop        1
5402   eisenhower     L-Peop        1  

В этом кадре данных есть много других столбцов, которые не имеют отношения к делу.Теперь я хочу сгруппировать токены в зависимости от их предложения (= s) и их прогнозируемых тегов, чтобы объединить их в одну сущность:

df2 =


s        token                        pred               
17     hakawati  theatre           Location
17     jerusalem                   Location
56     university of texas here    Organisation
...
5402   dwight d. eisenhower        People

Обычно я бы делал это, просто используя строку типа data_map = df.groupby(["s"],as_index=False, sort=False).agg(" ".join)и используя функцию переименования.Однако, поскольку данные содержат различные типы строк (B, I, L - Loc / Org ..), я не знаю, как именно это сделать.

Любые идеи приветствуются.

Есть идеи?

Ответы [ 2 ]

0 голосов
/ 02 июня 2018

Одно решение через вспомогательный столбец.

df['pred_cat'] = df['pred'].str.split('-').str[-1]

res = df.groupby(['s', 'pred_cat'])['token']\
        .apply(' '.join).reset_index()

print(res)

      s pred_cat                       token
0    17      Loc  hakawati theatre jerusalem
1    56      Org    university of texas here
2  5402     Peop        dwight d. eisenhower

Обратите внимание, что это не совсем соответствует желаемому результату;Похоже, что существует какая-то специфическая обработка данных.

0 голосов
/ 02 июня 2018

Вы можете сгруппировать по s и tokenID и агрегировать следующим образом:

def aggregate(df):
    token = " ".join(df.token)
    pred = df.iloc[0].pred.split("-", 1)[1]
    return pd.Series({"token": token, "pred": pred})

df.groupby(["s", "tokenID"]).apply(aggregate)

# Output
                             token  pred
s    tokenID                            
17   3            hakawati theatre   Loc
     7                   jerusalem   Loc
56   5         university of texas   Org
     6                        here   Org
5402 1        dwight d. eisenhower  Peop
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...