我正在尝试提取某些单词,我通过在一个文件中读取一列并使用这些单词(如果存在)创建新列来将其定义为关键字...
到目前为止,我有:
import pandas as pd
keywords= {"these", "are", "my", "keywords", "defined"}
df = pd.read_csv("this_is_my_file.csv", sep= ",")
....现在我被卡住了。有什么想法吗?我找到了该线程(extracting rows from CSV file based on specific keywords),我能够使它写入列标题,但不能基于键值写在每一行上。
编辑:我有很多关键字能够定义每个关键字(超过1k)。 我要遍历1k个“内容”行以搜索我的 关键字。
Keywords: {"cake", "pie", "sugar"}
Original:
ID contents
123 This is pie
1234 Cake be with you
Desired outcome:
ID contents new col
123 This is Pie
1234 be with you Cake
答案 0 :(得分:0)
如果我正确理解了您的问题,这就是解决方案:
import pandas as pd
keywords = ['a', 'b']
df = pd.DataFrame()
df['keywords'] = ['1', 'a', 'd', 'b']
df['contents'] = ['foo','foo','foo','foo',]
filtered_df = df[df['keywords'].isin(keywords)]
在最后一行中,我们使用df [ condition ]结构来过滤数据帧。此外,我们在系列(列)上使用pandas.isin()函数将其与关键字列表匹配。 结果数据框仅具有与此过滤器匹配的行。 关键字内容 1个foo 3 b foo
更新答案以使用过滤后的值创建一个新列:
import pandas as pd
keywords = ['a', 'b']
def check_keywords(x):
if x in keywords:
return x
return None
df = pd.DataFrame()
df['keywords'] = ['1', 'a', 'd', 'b']
df['contents'] = ['foo','foo','foo','foo',]
df['extracted_keywords']= df['keywords'].apply(check_keywords)
为此,我们使用了由pd.apply()调用的lambda函数。 Lambda函数本质上是针对循环的高度优化,该循环在系列的每一行上执行。
答案 1 :(得分:0)
我仍然不确定我是否完全了解你在这里的情况。对我来说,您不希望像您的输出所暗示的那样从描述中删除关键字。无论如何,这是一种产生具有与相应描述匹配的关键字的列的方法。您可能需要清理描述列中的文本,例如,我的示例没有任何标点符号。随意问关于这个话题的另一个问题。
import pandas as pd
keywords = {'sugar', 'spice'}
data = pd.DataFrame({'id': ['A', 'B', 'C', 'D'], 'description': ['My cake contains sugar', 'My cake contains spice', 'My cake has sugar and spice', 'My cake has only flour']})
data['keyword_match'] = pd.Series([[*j.intersection(keywords)] for j in [set(i) for i in data['description'].str.split()]]).apply(', '.join)
data
礼物: