在Python中为提取的单词创建表格是/否表

时间:2018-08-28 13:56:33

标签: python python-3.x pandas

我有一个文档列表和一个关键字列表,最后我需要一个表格来告诉哪个文档中存在哪些关键字。

到目前为止,我的代码:

d={}
for path in pathlist:
    # because path is object not string
    path_in_str = str(path)
    file_name=ntpath.basename(path_in_str)

    pdf_file = open(path_in_str, 'rb')
    text =""
    read_pdf = PyPDF2.PdfFileReader(pdf_file)
    c = read_pdf.numPages
    for i in range(c):
        page = read_pdf.getPage(i)
        text+=(page.extractText())
        matches = re.findall(regex3, text, re.IGNORECASE)
        d["string{0}".format(file_name)] = [x[1] for x in matches]

因此,字典“ d”具有作为“文档名称”的键和作为“水果名称”的值。示例如下:

enter image description here

请注意:一个键可以有多个值。直到这里一切都正常且正确为止。

我需要这样的最终输出:

Expected Output

有人可以让我知道如何转换字典。到上面的输出。

要更清楚:我不需要将dict转换为df,而需要将值转换为“是/否”表

3 个答案:

答案 0 :(得分:2)

让我们从这里开始,在这里创建数据框pd_df:

print(pd_df)

输出:

                0       1       2
Document1   apple  banana  orange
Document2    None  orange  banana
Document3  banana   apple    None
Document4   apple    None    None

现在尝试使用此方法来创建fruit_names列(与pd_df中的列数无关)

for fruit_name in ['apple', 'orange', 'banana']:
    pd_df.loc[:, fruit_name] = pd_df.apply(lambda x: 'y' if fruit_name in x.values.tolist() else 'n', axis=1)
print(df[['apple', 'orange', 'banana']])

输出:

          apple orange banana
Document1     y      y      y
Document2     n      y      y
Document3     y      n      y
Document4     y      n      n

答案 1 :(得分:1)

在将其用作DataFrame的输入之前,以所需的方式创建字典。

我没有您的文件,所以我做了我自己的文件:

import pandas as pd
import collections, re

d1 = 'apple banana cutie'
d2 = 'foo bar'
d3 = 'kiwi plum cherry'
d4 = 'orange fig tomato'
docs = [d1, d2, d3, d4]

对于每个文档,确定是否有有趣的水果,请以水果为键在字典中收集该信息-(每个key:value对将成为DataFrame中的一列)。将文档名称收集在一个单独的容器中,并将其用作DataFrame的索引。字典值中各项的位置与文档名称集合中各项的位置相对应。

fruits_i_care_about = ['apple', 'kiwi', 'banana', 'plum']
pattern = '|'.join(fruits_i_care_about)
fruit_regex = re.compile(pattern)

d = collections.defaultdict(list)

doc_names = []
for n, doc in enumerate(docs):
    doc_names.append('d{}'.format(n))
    fruits_in_doc = set(fruit_regex.findall(doc))
    print(fruits_in_doc)
    for fruit in fruits_i_care_about:
        d[fruit].append('y' if fruit in fruits_in_doc else 'n')

df = pd.DataFrame(d, index=doc_names)
我的解决方案中的

doc是一个字符串,如果您一次只读取一页,那么它将类似于一页。如果可能的话,您可以考虑阅读整个pdf,因此您只需要对每个文档执行一次正则表达式搜索即可。


字典如下:

defaultdict(<class 'list'>,
            {'apple': ['y', 'n', 'n', 'n'],
             'banana': ['y', 'n', 'n', 'n'],
             'kiwi': ['n', 'n', 'y', 'n'],
             'plum': ['n', 'n', 'y', 'n']})

结果数据框:

   apple kiwi banana plum
d0     y    n      y    n
d1     n    n      n    n
d2     n    y      n    y
d3     n    n      n    n

答案 2 :(得分:0)

这是熊猫的一项简单任务:

import pandas as pd
df = pd.DataFrame.from_dict(d, orient='index')