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

为Python中提取的单词创建表格式的是/否表,python,python-3.x,pandas,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 =""

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

到目前为止,我的代码是:

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]
因此,dict“d”的键为“文档名”,值为“水果名”。样本如下:

请注意:一个键可以有多个值。直到这里,一切都正常运转

我需要这样的最终输出:

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

有人能告诉我如何把字典转换成上面的输出吗


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

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

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

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

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

让我们从这里开始,在这里您创建了数据帧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
中有多少列):

输出:

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

让我们从这里开始,在这里您创建了数据帧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
中有多少列):

输出:

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

在将字典用作数据帧的输入之前,请按照所需的方式创建字典

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

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]
对于每个文档,确定它是否有有趣的结果,在字典中收集这些信息,并将结果作为键(每个键:值对都将是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']})

在将字典用作数据帧的输入之前,请按照所需的方式创建字典

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

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]
对于每个文档,确定它是否有有趣的结果,在字典中收集这些信息,并将结果作为键(每个键:值对都将是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']})


你是在问如何把你的字典输出成一个漂亮的表格吗?是的!!但不能直接将dict转换为df。相反,无论dict值中有什么水果名称,都应该是“Y”,其余为“N”。请为字典添加一个示例
d
:)您是否尝试过构建一个以水果名称为键的字典,并为值创建一个
Y
N
列表-列表项位置与文档id相关?然后您可以直接使用它来构建数据框架,使用
文档
x作为索引。@AllaTarighati:Donear您问过如何将字典输出为一个漂亮的表吗?是的!!但不能直接将dict转换为df。相反,无论dict值中有什么水果名称,都应该是“Y”,其余为“N”。请为字典添加一个示例
d
:)您是否尝试过构建一个以水果名称为键的字典,并为值创建一个
Y
N
列表-列表项位置与文档id相关?然后您可以直接使用它来构造数据帧,使用
Document
x作为索引。@AllaTarighati:done实际上,这只会将dict值作为单元格值转换为df。然而,我需要像问题中所附的快照一样的表格。难道不可能从@Josh Friedlander所说的开始,然后
pivot
生成的数据帧来获得所需的结果吗?@AllaTarighati:事实上,我已经用Josh发布的相同代码完成了dict到df的转换部分。我没有在我的原始问题中发布这一点,因为我不确定这是实现我想要的输出的正确路径。我基本上被这件事困住了。如何获得“Y”/“N”部分。此外,我可以有没有任何文档匹配文本的列。您可以使用列表理解来更改dict值中的列表吗?即得到所有水果(列)的列表,然后<代码> [y’,如果X在水果中'n'为匹配中的x ] < /代码>不工作……因为在我的DICT(d)列表中,我没有得到“n”,这实际上只将DICT转换为DF,将DICT值转换为单元格值。然而,我需要像问题中所附的快照一样的表格。难道不可能从@Josh Friedlander所说的开始,然后
pivot
生成的数据帧来获得所需的结果吗?@AllaTarighati:事实上,我已经用Josh发布的相同代码完成了dict到df的转换部分。我没有在我的原始问题中发布这一点,因为我不确定这是实现我想要的输出的正确路径。我基本上被这件事困住了。如何获得“Y”/“N”部分。此外,我可以有没有任何文档匹配文本的列。您可以使用列表理解来更改dict值中的列表吗?即得到所有水果(列)的列表,然后<代码> >‘y’,如果X在水果中'n'为匹配中的x ] < /代码>不工作……因为在我的DICT(d)ListType错误中,我没有得到“n”:类型“NoNeType”的参数不是“迭代”,现在@ Raull AgalWalWorkJig:)。相同的答案是否适用于忽略大小写和复数。所以,它是垫子