Свернуть pandas фрейм слов в предложения - PullRequest
1 голос
/ 01 апреля 2020

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

Пример ввода:

df = pd.DataFrame([('Effect', 'O'),
               ('of', 'O'),
               ('ginseng', 'i'),
               ('extract', 'i'),
               ('supplementation', 'i'),
               ('on', 'O'),
               ('testicular', 'o'),
               ('functions', 'o'),
               ('in', 'O'),
               ('diabetic', 'p'),
               ('rats', 'p'),
               ('.', 'p'),
               ('OBJECTIVE', 'O'),
               ('It', 'O'),
               ('was', 'O')],
               columns=('token', 'annotation'))

Цель output:

df = pd.DataFrame([('Effect of ginseng extract supplementation on testicular functions in diabetic rats.', \ 
                     ['O','O','i','i','i','O','o','o','O','p','p','p','O','O','O']),
                   ('OBJECTIVE It was', ['O','O','O'])],
                   columns=('token', 'annotation'))

Извините за тупой пример - это действительно первые 15 строк этого набора данных !!

Любые идеи о том, как сжать строки слов в строки предложений, очень цениться.

1 Ответ

0 голосов
/ 01 апреля 2020

Используйте GroupBy.agg:

new_df = (df.groupby(df['token'].eq('.').shift(fill_value=False).cumsum(),
        as_index=False)
            .agg({'token' : ' '.join, 'annotation': list}))
print(new_df)
                                               token  \
0  Effect of ginseng extract supplementation on t...   
1                                   OBJECTIVE It was   

                             annotation  
0  [O, O, i, i, i, O, o, o, O, p, p, p]  
1                             [O, O, O]

Если вы не хотите указывать последнюю точку:

m = df['token'].eq('.')
new_df = (df.groupby(m.shift(fill_value=False).cumsum().loc[~m],as_index=False)
            .agg({'token' : ' '.join, 'annotation': list}))
...