CSV文本基于关键字读/写到新文件

时间:2018-06-28 01:07:00

标签: python python-3.x pandas

我正在尝试提取某些单词,我通过在一个文件中读取一列并使用这些单词(如果存在)创建新列来将其定义为关键字...

到目前为止,我有:

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  

2 个答案:

答案 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

礼物:

enter image description here