如何在Python熊猫中将一列中包含多个句子的文本拆分为多行?

时间:2019-02-27 22:33:50

标签: python pandas text-mining sentence-synthesis

我试图将“注释”列拆分为包含每个句子的多行。我使用以下StackOverflow线程作为参考,因为它倾向于产生相似的结果。 参考链接: Select 数据帧的示例数据如下。

Id小组Food_Text 1 X食物很好。煮得很好。美味的! 2 X我讨厌鱿鱼。食物煮得不好。的确如此。 3 X请随时不要在这里过得好 4年我爱鱼。很棒的美味佳肴。 5 Y适合甜点。肉不好吃

“ Food_Text”的每个记录都可以包含多个句子,并用句号或句号分隔。我使用了以下代码

List<int> OnlySites = lsite.Select(s => s.Id).ToList();

我不确定为什么联接没有给我适当的数据帧,但行数更多。根据拆分索引重复其他列。因此,Id = 1有3个句子,因此我们应该有3条记录,所有其他数据都相同,并且Food_Text列应包含ID = 1的注释中的新句子。其他记录也是如此。

在此先感谢您的帮助! 问候, Sohil Shah

2 个答案:

答案 0 :(得分:0)

在您放入代码的示例中,打印了join的结果,因此,如果您想更改Survey_text的值,则代码应为:

survey_text = survey_text.join(x)

或者如果您想简化代码,下面的代码就可以了:

import numpy as np
import pandas as pd

survey_data = pd.read_csv("Food_Dummy.csv")
survey_text = survey_data[['Id','Team','Food_Text']]

# Getting s as pandas series which has split on full stop and new sentence a new line
s = survey_text["Food_Text"].str.split('.').apply(pd.Series,1).stack()
s.index = s.index.droplevel(-1) # to line up with df's index
s.name = 'Food_Text' # needs a name to join

# There are blank or emplty cell values after above process. Removing them
s.replace('', np.nan, inplace=True)
s.dropna(inplace=True)

# Joining should ideally get me proper output. But I am getting original dataframe instead of split one.
del survey_text['Food_Text']
survey_text = survey_text.join(s)
survey_text.head(10)

这样,您的DataFrame中就不会有多个“ Food_Text”列。

答案 1 :(得分:0)

代替

s = survey_text["Food_Text"].str.split('.').apply(pd.Series,1).stack()

更好的拆分句子的方法是使用nltk句子标记器

from nltk.tokenize import sent_tokenize
s = survey_text["Food_Text"].apply(lambda x : sent_tokenize(x)).apply(pd.Series,1).stack()