Разметьте текст и создайте больше строк для каждой строки в кадре данных - PullRequest
0 голосов
/ 24 мая 2019

Я хочу сделать это с python и pandas.

Предположим, у меня есть следующее:

file_id   text
1         I am the first document. I am a nice document.
2         I am the second document. I am an even nicer document.

и я наконец хочу получить следующее:

file_id   text
1         I am the first document
1         I am a nice document
2         I am the second document
2         I am an even nicer document

Итак, я хочу, чтобы текст каждого файла был разбит при каждом останове, и чтобы были созданы новые строки для каждого из токенов этих текстов.

Какой самый эффективный способ сделать это?

Ответы [ 2 ]

1 голос
/ 24 мая 2019

Использование:

s = (df.pop('text')
      .str.strip('.')
      .str.split('\.\s+', expand=True)
      .stack()
      .rename('text')
      .reset_index(level=1, drop=True))

df = df.join(s).reset_index(drop=True)
print (df)
   file_id                         text
0        1      I am the first document
1        1         I am a nice document
2        2     I am the second document
3        2  I am an even nicer document

Объяснение

Первое использование DataFrame.pop для столбца извлечения, удалить последнее . на Series.str.rstrip и разделить на Series.str.split с escape . потому что специальный символ регулярного выражения, измените на DataFrame.stack для серии, DataFrame.reset_index и rename для серии для DataFrame.join к оригиналу.

0 голосов
/ 24 мая 2019
df = pd.DataFrame( { 'field_id': [1,2], 
                    'text': ["I am the first document. I am a nice document.",
                             "I am the second document. I am an even nicer document."]})

df['sents'] = df.text.apply(lambda txt: [x for x in txt.split(".") if len(x) > 1])
df = df.set_index(['field_id']).apply(lambda x: 
                                      pd.Series(x['sents']),axis=1).stack().reset_index(level=1, drop=True)
df = df.reset_index()
df.columns = ['field_id','text']
...