我试图在数据集中运行我的百万行的函数 .
-
我在数据框中读取CSV中的数据
-
我使用drop list删除我不需要的数据
-
我在for循环中通过NLTK函数传递它 .
码:
def nlkt(val):
val=repr(val)
clean_txt = [word for word in val.split() if word.lower() not in stopwords.words('english')]
nopunc = [char for char in str(clean_txt) if char not in string.punctuation]
nonum = [char for char in nopunc if not char.isdigit()]
words_string = ''.join(nonum)
return words_string
现在我使用for循环调用上述函数来运行百万条记录 . 即使我在24核CPU和88 GB Ram的重量级服务器上,我看到循环花费了太多时间而没有使用那里的计算能力
我这样调用上面的函数
data = pd.read_excel(scrPath + "UserData_Full.xlsx", encoding='utf-8')
droplist = ['Submitter', 'Environment']
data.drop(droplist,axis=1,inplace=True)
#Merging the columns company and detailed description
data['Anylize_Text']= data['Company'].astype(str) + ' ' + data['Detailed_Description'].astype(str)
finallist =[]
for eachlist in data['Anylize_Text']:
z = nlkt(eachlist)
finallist.append(z)
当我们有几百万条记录时,上面的代码完全可以正常运行 . 它只是excel中的一个示例记录,但实际数据将在DB中运行,其数量将达到数亿 . 有没有什么方法可以加快操作以更快地通过函数传递数据 - 使用更多的计算能力?
1 回答
您的原始
nlkt()
循环每行3次 .此外,每次调用
nlkt()
时,您都会一次又一次地重新初始化这些内容 .stopwords.words('english')
string.punctuation
这些应该是全球的 .
逐行完成事情:
我不确定你为什么需要这样做 . 但是您可以轻松地将列转换为
str
类型 . 这应该在预处理功能之外完成 .希望这是不言自明的:
现在转到下一行:
使用
str.split()
很尴尬,你应该使用一个合适的标记器 . 否则,您的标点符号可能会卡在前面的单词中,例如:还应检查检查
.isdigit()
:把它们放在一起你的
nlkt()
应该是这样的:你可以使用DataFrame.apply: