【发布时间】:2021-08-24 06:07:34
【问题描述】:
我有一个带有文本列的 df。说:
d = {'text': ["merry had a little lamb and a broken limb", "Little Jonathan found a chicken"]}
df = pd.DataFrame(data=d)
我还有一个包含约 400 个关键字的列表,例如:
observations_words_list = ["bent","block","broken"]
我想看看有多少记录的文本中有多个关键字,我就是这样做的:
df = df['text'].dropna().reset_index()
df_len = len(df['text'])
obs = set(observations_words_list)
df['Observations'] = df['text'].apply(lambda x: len(set(str(x).lower().split()).intersection(obs)))
obs_count = len(df[df['Observations'] > 0])/df_len
对于示例 df(实际上我读取了大约 0.5m 条记录的 csv),我希望新列的第一条记录为 1,第二条记录为 0,总体而言 obs_count=0.5
运行时远不理想,我正在寻找一种更快的方法来处理这一步。
会喜欢你的想法。谢谢!
【问题讨论】:
-
你能查一下this吗?
-
解决方案是
Aho-Corasick algorithm这里 -
这在此处不适用,因为它在单词中查找单词,而在这里我相信 Gavriel 只是在字符串中查找整个单词(因此使用 str.split())
标签: python pandas list performance