在Python中操作列表中的某些值

2024-05-23 13:49:02 发布

您现在位置:Python中文网/ 问答频道 /正文

让我尽力解释一下,因为我不是Python向导。我与PyPDF2一起阅读了一份关于墨西哥新冠病毒-19的PDF数据表,并将其标记为长话短说,我试着用tabla做这件事,但没有得到我期望的格式,我打算花更多的时间重新格式化我得到的CSV文档,而不是分析它,并且得到了一个字符串列表,len为16792,这很好

现在,我面临的问题是,我需要以适当的方式对其进行格式化,将一些(不是全部)字符串连接在一起,以便创建一个长度相同的列表列表,即9列

这是目前情况的一个示例,列为病例编号、州、地区、性别、年龄、症状开始日期、状态、传染类型、到达墨西哥的日期:

['1', 'PUEBLA', 'PUEBLA', 'M', '49', '15/03/2020', 'Sospechoso', 'Contacto', 'NA', '2', 'GUERRERO', 'ZONA', 'NORTE', 'M', '29', '15/03/2020', 'Sospechoso', 'Contacto', 'NA', '3', 'BAJA', 'CALIFORNIA', 'TIJUANA', 'F', '34', '14/03/2020', 'Sospechoso', 'Estados', 'Unidos', '08/03/2020', '4', 'CIUDAD', 'DE', 'MÉXICO', 'TLALPAN', 'F', '69', '25/02/2020', 'Sospechoso', 'Italia', '03/03/2020', '5', 'JALISCO', 'CENTRO', 'GUADALAJARA', 'M', '19', '18/03/2020', 'Sospechoso', 'España', '17/03/2020'

我想要的是得到某些字符串,比如'ZONA','NORTE'作为'ZONA NORTE'或'CIUDAD','DE','MEXICO'作为'CIUDAD DE MEXICO'或'ESTADOS','UNIDOS'作为'ESTADOS UNIDOS'

我真的不知道如何解决这个问题。我试过,split(),replace(),试着找到每个频率的索引,阅读所有关于操作列表的问题,试过提供的几乎所有回答。。。但我没能做到

如有任何指导,将不胜感激。对不起,如果这是一个非常基本的问题,但我知道一定有办法,我只是不知道


Tags: 字符串列表denamexicopypdf2新冠ciudad
2条回答

我假设您要处理的数据来自类似于here的文件,它包含2623行x 8列

您可以使用tabula-py从PDF文件加载数据。您可以通过pip install tabula-py==1.3.0安装它。像这样提取表的一个问题是tabula-py有时会把事情搞砸。例如,表格的标题是从PDF文件中提取的,如下所示:

"",,,,Identificación Fecha de,
"",,,,de COVID-19,Fecha del llegada a
N° Caso,Estado,Sexo,Edad,Inicio de Procedencia por RT-PCR en,México
"",,,,síntomas,
"",,,,tiempo real,

挺恶心的吧

此外,tabula-py无法分隔某些列,即在正确的位置写入逗号,以便能够很好地解析输出CSV文件。例如,带有número de caso(案例编号)8的行:

8,BAJA CALIFORNIA,F,65,13/03/2020 Sospechoso Estados Unidos,08/03/2020

可以通过将“Sospechoso”替换为“Sospechoso”来修复您很幸运,因为这是您目前必须处理的唯一解析问题。因此,遍历输出CSV文件的行并将“Sospechoso”替换为“Sospechoso”,就可以解决所有问题

最后,我添加了一个选项(removeaccents),用于从数据中删除重音符号。这可以帮助您避免将来出现编码问题。为此,您需要unicode:pip install unidecode

将所有内容放在一起,读取PDF文件并将其转换为CSV文件并将其作为pandas数据帧加载的代码如下(您可以下载预处理的CSV文件here):

import tabula
from tabula import wrapper
import pandas as pd
import unidecode

"""
1. Adds the header.
2. Skips "corrupted" lines from tabula.
3. Replacing " Sospechoso " for ",Sospechoso," automatically separates
the previous column ("fecha_sintomas") from the next one ("procedencia").
4. Finally, elminiates accents to avoid encoding issues.
"""
def simplePrep( 
                input_path,
                header = [
                            "numero_caso",
                            "estado",
                            "sexo",
                            "edad",
                            "fecha_sintomas",
                            "identification_tiempo_real",
                            "procedencia",
                            "fecha_llegada_mexico"
                        ],
                lookfor = " Sospechoso ",
                replacewith = ",Sospechoso,",
                output_path = "preoprocessed.csv",
                skiprowsupto = 5,
                removeaccents = True
                ):
    fin = open(input_path, "rt")
    fout = open(output_path, "wt")

    fout.write(",".join(header) + "\n")

    count = 0

    for line in fin:
        if count > skiprowsupto - 1:
            if removeaccents:
                fout.write(unidecode.unidecode(line.replace(lookfor, replacewith)))
            else:
                fout.write(line.replace(lookfor, replacewith))

        count += 1
        
    fin.close()
    fout.close()

"""
Reads all the pdf pages specifying that the table spans multiple pages.
multiple_tables = True, otherwise the first row of each page will be missed.
"""
tabula.convert_into(
                        input_path = "data.pdf",
                        output_path = "output.csv",
                        output_format = "csv",
                        pages = 'all',
                        multiple_tables = True
                    )

simplePrep("output.csv", removeaccents = True)

# reads preprocess data set
df = pd.read_csv("preoprocessed.csv", header = 0)

# prints the first 5 samples in the dataframe
print(df.head(5))

因为每一行的短语分割是不同的,所以您有一种方法来“识别”它。一种方法是,如果相邻的两个列表项有3个以上的字母,则加入它们

import re
row_list = ['1', 'PUEBLA', 'PUEBLA', 'M', '49', '15/03/2020', 'Sospechoso', 'Contacto', 'NA', '2', 'GUERRERO', 'ZONA', 'NORTE', 'M', '29', '15/03/2020', 'Sospechoso', 'Contacto', 'NA', '3', 'BAJA', 'CALIFORNIA', 'TIJUANA', 'F', '34', '14/03/2020', 'Sospechoso', 'Estados', 'Unidos', '08/03/2020', '4', 'CIUDAD', 'DE', 'MÉXICO', 'TLALPAN', 'F', '69', '25/02/2020', 'Sospechoso', 'Italia', '03/03/2020', '5', 'JALISCO', 'CENTRO', 'GUADALAJARA', 'M', '19', '18/03/2020', 'Sospechoso', 'España', '17/03/2020']
words_longer_than_3 = r'([^\d\W]){3,}'


def is_a_word(text):
    return bool(re.findall(words_longer_than_3, text))


def get_next_item(row_list, i):
    try:
        next_item = row_list[i+1]
    except IndexError:
        return
    return is_a_word(next_item)


for i, item in enumerate(row_list):
    item_is_a_word = is_a_word(row_list[i])
    if not item_is_a_word:
        continue
    next_item_is_a_word = get_next_item(row_list, i)
    while next_item_is_a_word:
        row_list[i] += f' {row_list[i+1]}'
        del row_list[i+1]
        next_item_is_a_word = get_next_item(row_list, i)

print(row_list)

结果:

['1', 'PUEBLA PUEBLA', 'M', '49', '15/03/2020', 'Sospechoso Contacto', 'NA', '2', 'GUERRERO ZONA NORTE', 'M', '29', '15/03/2020', 'Sospechoso Contacto', 'NA', '3', 'BAJA CALIFORNIA TIJUANA', 'F', '34', '14/03/2020', 'Sospechoso Estados Unidos', '08/03/2020', '4', 'CIUDAD', 'DE', 'MÉXICO TLALPAN', 'F', '69', '25/02/2020', 'Sospechoso Italia', '03/03/2020', '5', 'JALISCO CENTRO GUADALAJARA', 'M', '19', '18/03/2020', 'Sospechoso España', '17/03/2020']

相关问题 更多 >