精华内容
下载资源
问答
  • 很多开发者说自从有了 Python/Pandas,Excel 都不怎么用了,用它来处理与可视化表格非常快速。...然后我们再用list直接对结果进行类型转换转换为list。In [135]:for row in rows4:print(row)('name',...

    很多开发者说自从有了 Python/Pandas,Excel 都不怎么用了,用它来处理与可视化表格非常快速。

    下面我来举几个例子。

    删除重复行和空行

    我们直接用dict.fromkeys的方法把当前的数据转为字典,默认的值为None因为用不到,也就无所谓了。然后我们再用list直接对结果进行类型转换,转换为list。

    In [135]:

    for row in rows4:

    print(row)

    ('name', 'address')

    ('tom li', 'beijing')

    ('tom li', 'beijing')

    ('',)

    ('mary wang', 'shandong')

    ('mary wang', 'shandong')

    ('',)

    ('de8ug', 'guangzhou')

    In [148]:

    dict.fromkeys(rows4)

    Out[148]:

    {('name', 'address'): None,

    ('tom li', 'beijing'): None,

    ('',): None,

    ('mary wang', 'shandong'): None,

    ('de8ug', 'guangzhou'): None}

    In [137]:

    list(dict.fromkeys(rows4))

    Out[137]:

    [('name', 'address'),

    ('tom li', 'beijing'),

    ('',),

    ('mary wang', 'shandong'),

    ('de8ug', 'guangzhou')]

    这时候,重复数据直接去掉了,注意我们这里的dict是python3新版本的,所以顺序没有影响,如果你还在用python2或者python3.5以下,建议升级一下python版本。

    接下来,就是空数据的处理了。观察('',)是个元组,第一个位置的数据为空字符串,那么整体长度为1,可以直接通过循环来去掉。

    这里的循环我们可以用Python中的语法糖写法,直接一行搞定,最后加个判断只留下长度大于1,最后用list转换为列表。

    In [179]:

    list(x for x in dict.fromkeys(rows4) if len(x[0])>1)

    Out[179]:

    [('name', 'address'),

    ('tom li', 'beijing'),

    ('mary wang', 'shandong'),

    ('de8ug', 'guangzhou')]

    上面的研究搞定了,直接把研究结果放到函数中解决重复行和空行的问题。

    注意这时候我们处理的行数据,所以就不再按列循环了。而且,当前的sheet中处理之后,每一行的内容都会修改位置或删除。所以我们先用old_rows = [x for x in sheet.values]取到旧的每一行的数据,注意这里的sheet后直接用values取到数据,而不是cell对象。这里的old_rows是个列表,就可以用刚才的研究直接转为删除重复和空行的数据了。

    接下来,用sheet.delete_rows(1, sheet.max_row)

    删除所有行,第一个参数表示从第一行开始,第二个参数为最大行数。最后,用循环新的行数据的方式,把新数据写入当前的sheet。

    In [189]:

    def handle_duplicate(wb, sheetname):

    """

    去除重复行,空行

    先取出每一行,清空sheet,处理后写回

    """

    print(f'开始处理工作表:{sheetname}'.center(18, '-'))

    sheet = wb[sheetname]

    old_rows = [x for x in sheet.values]

    print('修改前:', old_rows)

    new_rows = list(x for x in dict.fromkeys(old_rows) if len(x[0])>1)

    print('修改后-》》', new_rows)

    # 删除所有行

    sheet.delete_rows(1, sheet.max_row)

    # 写入新数据

    for row in new_rows:

    sheet.append(row)

    运行测试,查看结果。再说一次,一定记得测试啊!如果有错误就根据错误提示,查看代码,反复调试,去除bugs。

    In [190]:

    wb = load_data()

    handle_duplicate(wb, '重复行')

    save_as(wb)

    删除空格

    删除空格也需要用到字符串的函数,所以这里还是简单研究一下。如果我们想去除字符串中间的空格,可以用split默认进行分割,然后把分割的结果用’’.join方法连接起来就可以了。

    注意join前是空的字符串。这里也用不到strip去除两端的空格了,因为split分割后只有几个最后的字符串组成的列表。

    In [192]:

    a="a b c "

    In [194]:

    a.strip()

    Out[194]:

    'a b c'

    In [195]:

    a.split()

    Out[195]:

    ['a', 'b', 'c']

    In [196]:

    ''.join(a.split())

    Out[196]:

    'abc'

    In [ ]:

    研究成功后,写入函数。这次命名为handle_blank。

    In [197]:

    def handle_blank(wb, sheetname):

    """

    按列循环, 通过参数确认目标

    """

    print(f'开始处理工作表:{sheetname}'.center(18, '-'))

    sheet = wb[sheetname]

    for col in sheet.iter_cols(): # 不加参数,循环所有列

    for cell in col:

    print('修改前:', cell.value, end='')

    cell.value = ''.join(cell.value.split())

    print('修改后-》》',cell.value)

    In [198]:

    handle_blank(wb, '空格')

    修改日期和时间格式

    有时候,我们需要对表格中时间相关的单元格进行格式修改,这里需要用到Python中时间模块datetime,将需要的格式进行拼接后,用strftime进行转换。

    假设这里我们想把之前简单的1/11月日格式,更改为年月日的样式,中间加上分隔符/或-,就需要用"%x"或"%Y-%m-%d"来进行操作了。注意这里的%加字母都是官方定义好的格式而已,我们用到时候进行拼接,传给函数就可以了。

    具体更多的拼接格式如下:

    In [199]:

    import datetime

    In [209]:

    d=datetime.datetime(2019,1,11)

    In [203]:

    d.strftime("%x")

    Out[203]:

    '01/11/19'

    In [205]:

    d.strftime("%Y-%m-%d")

    Out[205]:

    '2019-01-11'

    研究完成后,我们编写函数。

    首先需要用m, d = cell.value.split('/')把之前简单的日期进行分割,得到m,代表月份和日期,然后用datetime进行转换,生成时间相关的对象day,注意里面的参数是数字,所以用int转换,最后把day进行格式化输出。编写函数后,一定记得测试。

    In [218]:

    def handle_time(wb, sheetname):

    """

    按列循环, 通过参数确认目标

    """

    print(f'开始处理工作表:{sheetname}'.center(18, '-'))

    sheet = wb[sheetname]

    for col in sheet.iter_cols(max_col=1, min_row=2): # 找到时间的列, 第一列,从第二行开始

    for cell in col:

    print('修改前:', cell.value, end='')

    m, d = cell.value.split('/')

    day = datetime.datetime(2019, int(m), int(d))

    cell.value = day.strftime("%Y-%m-%d")

    print('修改后-》》',cell.value)

    In [220]:

    wb = load_data()

    handle_time(wb, '时间')

    save_as(wb)

    修复数字和符号

    接下来,处理数字和符号相关的操作。加入我们之前的价格,很多是有小数点的,这时候还想保存两位小数,并加上人民币符号为前缀。就需要新的一波研究了。

    有小数点,一是要保证位数,我们这里要求2位,二是要对多余的位数四舍五入。可以有以下俩个方式完成,一个用Decimal一个用round,两个的区别是Decimal("0.00")指定位数后,会自动补0,而round遇到0就自动舍掉了。而且round在四舍五入的计算中,还有点特殊。具体可查看官方文档。

    我们这里用Decimal来完成函数内相关操作。记得测试啊!

    In [227]:

    from decimal import Decimal

    In [240]:

    a = 3.1

    b=Decimal(a).quantize(Decimal("0.00"))

    print(b)

    3.10

    In [244]:

    round(a,2) # 位数自动省略0

    Out[244]:

    3.1

    In [247]:

    def handle_num(wb, sheetname):

    """

    按列循环, 通过参数确认目标

    """

    print(f'开始处理工作表:{sheetname}'.center(18, '-'))

    sheet = wb[sheetname]

    for col in sheet.iter_cols(min_col=3, max_col=3, min_row=2): # 找到时间的列, 第一列,从第二行开始

    for cell in col:

    print('修改前:', cell.value, end='')

    # cell.value = round(float(cell.value), 3)

    cell.value = '¥' + str(Decimal(cell.value).quantize(Decimal("0.00")))

    print('修改后-》》',cell.value)

    In [249]:

    wb = load_data()

    handle_num(wb, '数字符号')

    save_as(wb)文源网络,仅供学习之用,侵删。

    在学习Python的道路上肯定会遇见困难,别慌,我这里有一套学习资料,包含40+本电子书,800+个教学视频,涉及Python基础、爬虫、框架、数据分析、机器学习等,不怕你学不会!

    https://shimo.im/docs/JWCghr8prjCVCxxK/ 《Python学习资料》

    关注公众号【Python圈子】,优质文章每日送达。

    展开全文
  • 公众号后台回复“图书“,了解更多号主新书内容作者:小小明来源:菜J学Python需求有一个下面这种形式的word表格:希望能转换为下面这种格式的excel表格:测试word文档读取先测试...


    公众号后台回复“图书“,了解更多号主新书内容

    作者:小小明

    来源:菜J学Python

    需求

    有一个下面这种形式的word表格:

    希望能转换为下面这种格式的excel表格:

    测试word文档读取

    先测试一个word文档前1页的数据读取:

    from docx import Document
    
    doc = Document("编号02 质检员高级技师(一级)理论试卷.docx")
    for i, paragraph in enumerate(doc.paragraphs[:55]):
        print(i, paragraph.text)
    
    0 职业能力评价理论试卷
    1 (一级. 质检员)
    2 注意事项:1.答卷前将密封线内的项目填写清楚。
    3 2.填写答案必须用蓝色(或黑色)钢笔、圆珠笔,不许用铅笔或红笔。
    4 3.本份试卷共四道大题,满分100分,考试时间120分钟。
    5 一、单项选择题(第1~40题。选择正确的答案,将相应的字母填入题内的括号中。每题1分,满分40分。)
    6 1. 关于道德的叙述,正确的是(   )。
    7 (A)道德中的“应该”与“不应该”因人而异,没有共同道德标准
    8 (B)道德是处理人与人之间、人与社会之间关系的特殊行为规范
    9 (C)道德是现代文明的产物        
    10 (D)道德从来没有阶级性
    11 2.以下哪个选项不属于遵守职业纪律(    )。
    12 (A)右侧行驶		   (B)客人先行 	        (C)先抑后扬   	  (D)下班锁门 
    13 3. 国际标准化组织ISO9000:2000标准中,把质量定义为一组(     )特性满足要求的程度。
    14 (A)常量		       (B)变量		        (C) 流动	        	(D)固有
    15 4. 软件是有通过载体表达的信息所组成的(   )产品。
    16 (A)知识	           (B)信息	        	(C)数据              (D)标准
    17 5. (   )是指由最高管理者正式发布的与质量有关的组织总的意图和方向。
    18 (A)质量目标        (B)质量方针           (C)质量管理           (D)质量控制
    19 6. ISO9000族当中,(    )和八项管理原则一直是最核心的内容。
    20 (A)PCDA模式        (B)PCDA循环          (C)PDCA模式          (D)PDCA循环
    21 7.(  )是第一家实施六西格玛管理的公司。 
    22 (A)通用电气          (B)摩托罗拉 
    23 (C)丰田         (D)微软
    24 8. 产生、形成、实现、使用和衰亡的过程,质量专家朱兰称质量形成的这种过程为(    )。
    25 (A)质量螺旋      (B)质量周期      (C)产品螺旋       (D)产品周期  
    26 9. 计量值数据是指可以连续取值的数据,又称(    )数据。
    27 (A)计量型        (B)连续型        (C)稳定型         (D)常规型
    28 10. 国家标准当中强制性标准用(    )指代含义。
    29 (A)CCC           (B)GB            (C)GB/T           (D)CCIB
    30 11. 异常波动能引起系统性的(    )。
    31 (A)失误或停滞      (B) 错误或中断    (C) 失效或缺陷    (D) 失败或终止 
    32 12.(   )是判断和预报生产过程中质量状况是否发生波动的一种有效方法。
    33 (A)分布图    (B) 质量图    (C) 控制图    (D) 控制界限
    34 13. 过程能力一般采用标准差的6倍即6σ来量度,其计算公式为(    )。
    35 (A)B=6σ≈6S=24(R/dn)   (B)B=6σ≈6S=12(R/d₂)          
    36 (C)B=6σ≈6S=6(R/dn)    (D)B=6σ≈6S=6(R/d₂)
    37 14. 提高过程能力的重要途径之一就是尽量减少σ,使质量特征值的离散程度(	 )。
    38 (A)变大	         (B)变小          	(C)平稳          	(D)不变
    39 15.(    )亦称频数分布图,它适用于对大量计量值数数据进行整理加工,找出其统计规律。
    40 (A)直方图                             (B)散布图
    41 (C)排列图                             (D)控制图
    42 16. 因素在实验中所处的状态和条件变化可能引起指标变动,把因素变化各种状态和条件成为因素的( 	)。
    43 (A)因子        (B)位级          (C)强度	        (D)状态
    44 17. 1988年提出的一种确定客户需求和相应产品或服务性能之间联系的图示方法叫做(    )。
    45 (A)质量屋      (B)顾客需求	    (C)技术要求	 	(D)关系矩阵
    46 18. (    )是指产品在存放和使用过程中,随着时间的推移而直接影响产品质量特性稳定性的因素。
    47 (A)外噪声	     (B)内噪声	    (C)随机噪声       (D)以上都不对·
    48 19. (    )是产品设计的核心,在系统设计确定了产品或系统的目的功能及结构之后进行。
    49 (A)参数设计    (B)常量设计     (C)变量设计     (D)系统设计
    50 20. 以下不属于“双五归零”基本术语的是(     )。
    51 	(A)质量问题							(B)质量缺陷		
    52 (C)重复性质量问题	                    (D)产品交付前的质量问题
    53 21. 质量检验当中,(    )可以保证工艺过程的质量符合性。
    54 (A)进货检验   (B)过程检验      (C)工艺检验      (D)最终检验

    从读取效果上看,各行文本数据都能很顺利的获取到。

    匹配题型、题目和具体的选项

    现在我们需要做的是就是匹配题型、题目和具体的选项,观察可以发现规律:

    1. 题型以大写数字开头

    2. 题目以普通数字+.开头

    3. 选项以括号+字母开头

    额外需要注意的:

    1. 开头几行文本也存在普通数字+.开头的,需要直接排除。

    2. 第7题的题目,和第19题的选项存在一些特殊的空白字符需要排除,

    3. 括号和小数点都同时存在半角和全角两种情况。

    对于需要注意的第二点:

    查看一下这2处的空白字符:

    doc.paragraphs[21].text
    
    '7.(\xa0\xa0)是第一家实施六西格玛管理的公司。\xa0'
    doc.paragraphs[49].text
    
    '(A)参数设计    (B)常量设计\u3000    (C)变量设计\u3000\u3000   (D)系统设计'

    发现分别是\xa0和\u3000。

    整理好大致思路,我组织一下处理代码:

    import re
    from docx import Document
    
    doc = Document("编号02 质检员高级技师(一级)理论试卷.docx")
    
    black_char = re.compile("[\s\u3000\xa0]+")
    
    chinese_nums_rule = re.compile("[一二三四]、(.+?)\(")
    title_rule = re.compile("\d+.")
    option_rule = re.compile("\([ABCDEF]\)")
    option_rule_search = re.compile("\([ABCDEF]\)[^(]+")
    
    
    # 从word文档的“一、单项选择题”开始遍历数据
    for paragraph in doc.paragraphs[5:25]:
        #  去除空白字符,将全角字符转半角字符,并给括号之间调整为中间二个空格
        line = black_char.sub("", paragraph.text).replace(
            "(", "(").replace(")", ")").replace(".", ".").replace("()", "(  )")
        # 对于空白行就直接跳过
        if not line:
            continue
        if title_rule.match(line):
            print("题目", line)
        elif option_rule.match(line):
            print("选项", option_rule_search.findall(line))
        else:
            chinese_nums_match = chinese_nums_rule.match(line)
            if chinese_nums_match:
                print("题型", chinese_nums_match.group(1))
    
    题型 单项选择题
    题目 1.关于道德的叙述,正确的是(  )。
    选项 ['(A)道德中的“应该”与“不应该”因人而异,没有共同道德标准']
    选项 ['(B)道德是处理人与人之间、人与社会之间关系的特殊行为规范']
    选项 ['(C)道德是现代文明的产物']
    选项 ['(D)道德从来没有阶级性']
    题目 2.以下哪个选项不属于遵守职业纪律(  )。
    选项 ['(A)右侧行驶', '(B)客人先行', '(C)先抑后扬', '(D)下班锁门']
    题目 3.国际标准化组织ISO9000:2000标准中,把质量定义为一组(  )特性满足要求的程度。
    选项 ['(A)常量', '(B)变量', '(C)流动', '(D)固有']
    题目 4.软件是有通过载体表达的信息所组成的(  )产品。
    选项 ['(A)知识', '(B)信息', '(C)数据', '(D)标准']
    题目 5.(  )是指由最高管理者正式发布的与质量有关的组织总的意图和方向。
    选项 ['(A)质量目标', '(B)质量方针', '(C)质量管理', '(D)质量控制']
    题目 6.ISO9000族当中,(  )和八项管理原则一直是最核心的内容。
    选项 ['(A)PCDA模式', '(B)PCDA循环', '(C)PDCA模式', '(D)PDCA循环']
    题目 7.(  )是第一家实施六西格玛管理的公司。
    选项 ['(A)通用电气', '(B)摩托罗拉']
    选项 ['(C)丰田', '(D)微软']
    题目 8.产生、形成、实现、使用和衰亡的过程,质量专家朱兰称质量形成的这种过程为(  )。

    从目前测试结果来看没有问题。

    保存匹配到的数据到结构化字典

    现在我打算将当前匹配出来的文本数据存储成字典形式的结构化数据,字典结构的设计如下:

    根据上述设计完善代码:

    import re
    from docx import Document
    from collections import OrderedDict
    
    doc = Document("编号02 质检员高级技师(一级)理论试卷.docx")
    
    black_char = re.compile("[\s\u3000\xa0]+")
    
    chinese_nums_rule = re.compile("[一二三四]、(.+?)\(")
    title_rule = re.compile("\d+.")
    option_rule = re.compile("\([ABCDEF]\)")
    option_rule_search = re.compile("\([ABCDEF]\)[^(]+")
    
    # 保存最终的结构化数据
    question_type2data = OrderedDict()
    # 从word文档的“一、单项选择题”开始遍历数据
    for paragraph in doc.paragraphs[5:]:
        #  去除空白字符,将全角字符转半角字符,并给括号之间调整为中间一个空格
        line = black_char.sub("", paragraph.text).replace(
            "(", "(").replace(")", ")").replace(".", ".").replace("()", "(  )")
        # 对于空白行就直接跳过
        if not line:
            continue
        if title_rule.match(line):
            options = title2options.setdefault(line, [])
        elif option_rule.match(line):
            options.extend(option_rule_search.findall(line))
        else:
            chinese_nums_match = chinese_nums_rule.match(line)
            if chinese_nums_match:
                question_type = chinese_nums_match.group(1)
                title2options = question_type2data.setdefault(question_type, OrderedDict())
    

    遍历结构化字典并存储

    然后我们遍历结构化字典,将数据保存到pandas对象中:

    import pandas as pd
    
    result = []
    max_options_len = 0
    for question_type, title2options in question_type2data.items():
        for title, options in title2options.items():
            result.append([question_type, title, *options])
            options_len = len(options)
            if options_len > max_options_len:
                max_options_len = options_len
    df = pd.DataFrame(result, columns=[
                      "题型", "题目"]+[f"选项{i}" for i in range(1, max_options_len+1)])
    # 题型可以简化下,去掉选择两个字
    df['题型'] = df['题型'].str.replace("选择", "")
    df.head()
    

    结果:

    最终保存结果:

    df.to_excel("result.xlsx", index=False)
    

    完整代码

    最终完整代码:

    import pandas as pd
    import re
    from docx import Document
    from collections import OrderedDict
    
    doc = Document("编号02 质检员高级技师(一级)理论试卷.docx")
    
    black_char = re.compile("[\s\u3000\xa0]+")
    
    chinese_nums_rule = re.compile("[一二三四]、(.+?)\(")
    title_rule = re.compile("\d+.")
    option_rule = re.compile("\([ABCDEF]\)")
    option_rule_search = re.compile("\([ABCDEF]\)[^(]+")
    
    # 保存最终的结构化数据
    question_type2data = OrderedDict()
    # 从word文档的“一、单项选择题”开始遍历数据
    for paragraph in doc.paragraphs[5:]:
        #  去除空白字符,将全角字符转半角字符,并给括号之间调整为中间一个空格
        line = black_char.sub("", paragraph.text).replace(
            "(", "(").replace(")", ")").replace(".", ".").replace("()", "(  )")
        # 对于空白行就直接跳过
        if not line:
            continue
        if title_rule.match(line):
            options = title2options.setdefault(line, [])
        elif option_rule.match(line):
            options.extend(option_rule_search.findall(line))
        else:
            chinese_nums_match = chinese_nums_rule.match(line)
            if chinese_nums_match:
                question_type = chinese_nums_match.group(1)
                title2options = question_type2data.setdefault(
                    question_type, OrderedDict())
    
    result = []
    max_options_len = 0
    for question_type, title2options in question_type2data.items():
        for title, options in title2options.items():
            result.append([question_type, title, *options])
            options_len = len(options)
            if options_len > max_options_len:
                max_options_len = options_len
    df = pd.DataFrame(result, columns=[
                      "题型", "题目"]+[f"选项{i}" for i in range(1, max_options_len+1)])
    # 题型可以简化下,去掉选择两个字
    df['题型'] = df['题型'].str.replace("选择", "")
    df.to_excel("result.xlsx", index=False)
    

    最终得到的文件:

    ◆ ◆ ◆  ◆ ◆麟哥新书已经在当当上架了,我写了本书:《拿下Offer-数据分析师求职面试指南》,目前当当正在举行活动,大家可以用相当于原价5折的预购价格购买,还是非常划算的:
    
    
    
    数据森麟公众号的交流群已经建立,许多小伙伴已经加入其中,感谢大家的支持。大家可以在群里交流关于数据分析&数据挖掘的相关内容,还没有加入的小伙伴可以扫描下方管理员二维码,进群前一定要关注公众号奥,关注后让管理员帮忙拉进群,期待大家的加入。
    管理员二维码:
    猜你喜欢
    ● 卧槽!原来爬取B站弹幕这么简单● 厉害了!麟哥新书登顶京东销量排行榜!● 笑死人不偿命的知乎沙雕问题排行榜
    ● 用Python扒出B站那些“惊为天人”的阿婆主!● 你相信逛B站也能学编程吗
    
    展开全文
  • 倘若现在我们有以下的表格,我们要使用机器学习的模型对它进行建模分析(标签未出),然后看到这些文字特征我们首先第一反应就是对它进行One-Hot处理。 城市 食品 饮品 广州 牛奶 果汁 深圳 面包 椰汁 ...

    抛出问题

    倘若现在我们有以下的表格,我们要使用机器学习的模型对它进行建模分析(标签未列出),然后看到这些文字特征我们首先第一反应就是对它进行One-Hot处理。

    城市食品饮品
    广州牛奶果汁
    深圳面包椰汁
    北京烤鸭二锅头
    武汉热干面牛奶
    汕头牛肉丸牛肉汤

    One-Hot后的结果就变成了

    城市食品饮品
    000100010100
    001000100010
    001100110011
    010001000001
    010101010101

    这只是简单的One-Hot处理,我们把相同的东西用同样的One-Hot编码替代,但我们从表格中可以看出,牛奶在食品中出现过,在饮品中也出现过,它在One-Hot之后的值是一样的,都是0001。

    类似相关的问题例如基因,当出现了等位基因的情况,或者是A染色体上的某个基因的代号与B染色体上的某个基因代号是相同的时候,我们要如何得知,该基因在One-Hot了之后的重要性到底是多少呢?

    然后,找了很多资料,写了个代码如下:Python能力不强,代码写的有点笨,有建议可以评论一下。

    import re
    import numpy as np
    import pandas as pd
    
    df = pd.read_csv('.\\bingli.csv', header=None, encoding='gbk').fillna('nan').values
    
    # 声明存放无重复列名的列表
    # fea = [[]]
    # 声明存放新列名的列表
    ndf = []
    kf = []
    # 在df表的列进行循环
    for i in range(0, len(df[0])):
        # 声明基因的名称的列表
        ldf = []
        # 将列名取出来
        locname = df[0][i]
        
        # 在df表的行创建循环
        for j in range(len(df)):
            # 取出每个基因的名称
            name = df[j][i]
            # 跳过列名,且删除掉字段中的'\t'字符
            if j != 0:
                name = str(re.sub(r'\D', "", df[j][i]))
            # 如果基因的名称不在列表中且不为nan和空格,则加入列名列表中
            if name not in ldf and name != 'nan' and name != "":
                ldf.append(name)
        # print(sorted(ldf))
        # 使用fea列表存储列名,用于统计
        # fea.append(ldf)
        # 将列名排序后,为每个列名加上基因名称的后缀
        for k in sorted(ldf):
            if k == locname:
                pass
            else:
                kf.append(locname + '_' + k)
    ndf.append(kf)
    
    
    # =============================================================================
    # 在原表df中按行循环:
    #     取出每个列的列名和编码
    #     使用if语句进行判读
    # =============================================================================
    for i in range(1, len(df)):
        tmp = []
        indexs = []
    
        # 从原表的行中按个循环
        for j in range(len(df[i])):
            # 获取基因编码和列名
            feaname = df[i][j]
            colname = df[0][j]
            if feaname == "" or feaname == 'nan':
                pass
            else:
                # 去除基因编码的多余WhiteSpace等,仅保留数字
                feaname = str(re.sub(r'\D', "", feaname))
                # 判断否个特征的数据是否出现过,如出现了,则找出它的index
                for k in range(len(ndf[0])):
                    if ndf[0][k].startswith(colname) and ndf[0][k].endswith(feaname):
                        # print(ndf[0][k], colna, feaname, k,)
                        indexs.append(k)
        # 根据index给样本加1
        for h in range(len(ndf[0])):
            if h in indexs:
                tmp.append(1)
            else:
                tmp.append(0)
                
        ndf.append(tmp)
    

    这个代码的效果主要是,将这种格式的数据
    在这里插入图片描述

    变成:
    在这里插入图片描述
    也就是使用特征名称加上数据组合成新的特征,然后在样本中出现过的标为1,否则为0。

    其实我现在有点犹豫,这么做到底有没有意义?Catboost是可以直接跑,只要设置特征列就好了,其他的模型就不行,但是这样处理后就会造成一个数据稀疏的问题,毕竟一行的1太少了,而0太多了。

    展开全文
  • 将word试卷匹配转换为结构化表格

    万次阅读 多人点赞 2021-01-03 15:29:43
    希望能转换为下面这种格式的excel表格: 测试word文档读取 先测试一个word文档前1页的数据读取: from docx import Document doc = Document("编号02 质检员高级技师(一级)理论试卷.docx") for i, paragraph in ...

    作者:小小明

    Pandas数据处理专家,帮助一万用户解决数据处理难题。

    需求

    有一个下面这种形式的word表格:

    image-20210103113233053

    希望能转换为下面这种格式的excel表格:

    image-20210103113419139

    测试word文档读取

    先测试一个word文档前1页的数据读取:

    from docx import Document
    
    doc = Document("编号02 质检员高级技师(一级)理论试卷.docx")
    for i, paragraph in enumerate(doc.paragraphs[:55]):
        print(i, paragraph.text)
    
    0 职业能力评价理论试卷
    1 (一级. 质检员)
    2 注意事项:1.答卷前将密封线内的项目填写清楚。
    3 2.填写答案必须用蓝色(或黑色)钢笔、圆珠笔,不许用铅笔或红笔。
    4 3.本份试卷共四道大题,满分100分,考试时间120分钟。
    5 一、单项选择题(第1~40题。选择正确的答案,将相应的字母填入题内的括号中。每题1分,满分40分。)
    6 1. 关于道德的叙述,正确的是(   )。
    7 (A)道德中的“应该”与“不应该”因人而异,没有共同道德标准
    8 (B)道德是处理人与人之间、人与社会之间关系的特殊行为规范
    9 (C)道德是现代文明的产物        
    10 (D)道德从来没有阶级性
    11 2.以下哪个选项不属于遵守职业纪律(    )。
    12 (A)右侧行驶		   (B)客人先行 	        (C)先抑后扬   	  (D)下班锁门 
    13 3. 国际标准化组织ISO9000:2000标准中,把质量定义为一组(     )特性满足要求的程度。
    14 (A)常量		       (B)变量		        (C) 流动	        	(D)固有
    15 4. 软件是有通过载体表达的信息所组成的(   )产品。
    16 (A)知识	           (B)信息	        	(C)数据              (D)标准
    17 5. (   )是指由最高管理者正式发布的与质量有关的组织总的意图和方向。 
    18 (A)质量目标        (B)质量方针           (C)质量管理           (D)质量控制
    19 6. ISO9000族当中,(    )和八项管理原则一直是最核心的内容。  
    20 (A)PCDA模式        (B)PCDA循环          (C)PDCA模式          (D)PDCA循环
    21 7.(  )是第一家实施六西格玛管理的公司。 
    22 (A)通用电气          (B)摩托罗拉 
    23 (C)丰田         (D)微软
    24 8. 产生、形成、实现、使用和衰亡的过程,质量专家朱兰称质量形成的这种过程为(    )。 
    25 (A)质量螺旋      (B)质量周期      (C)产品螺旋       (D)产品周期  
    26 9. 计量值数据是指可以连续取值的数据,又称(    )数据。
    27 (A)计量型        (B)连续型        (C)稳定型         (D)常规型
    28 10. 国家标准当中强制性标准用(    )指代含义。 
    29 (A)CCC           (B)GB            (C)GB/T           (D)CCIB
    30 11. 异常波动能引起系统性的(    )。
    31 (A)失误或停滞      (B) 错误或中断    (C) 失效或缺陷    (D) 失败或终止 
    32 12.(   )是判断和预报生产过程中质量状况是否发生波动的一种有效方法。
    33 (A)分布图    (B) 质量图    (C) 控制图    (D) 控制界限
    34 13. 过程能力一般采用标准差的6倍即6σ来量度,其计算公式为(    )。
    35 (A)B=6σ≈6S=24(R/dn)   (B)B=6σ≈6S=12(R/d₂)          
    36 (C)B=6σ≈6S=6(R/dn)    (D)B=6σ≈6S=6(R/d₂)
    37 14. 提高过程能力的重要途径之一就是尽量减少σ,使质量特征值的离散程度(	 )。
    38 (A)变大	         (B)变小          	(C)平稳          	(D)不变
    39 15.(    )亦称频数分布图,它适用于对大量计量值数数据进行整理加工,找出其统计规律。
    40 (A)直方图                             (B)散布图
    41 (C)排列图                             (D)控制图
    42 16. 因素在实验中所处的状态和条件变化可能引起指标变动,把因素变化各种状态和条件成为因素的( 	)。
    43 (A)因子        (B)位级          (C)强度	        (D)状态
    44 17. 1988年提出的一种确定客户需求和相应产品或服务性能之间联系的图示方法叫做(    )。
    45 (A)质量屋      (B)顾客需求	    (C)技术要求	 	(D)关系矩阵
    46 18. (    )是指产品在存放和使用过程中,随着时间的推移而直接影响产品质量特性稳定性的因素。
    47 (A)外噪声	     (B)内噪声	    (C)随机噪声       (D)以上都不对·
    48 19. (    )是产品设计的核心,在系统设计确定了产品或系统的目的功能及结构之后进行。
    49 (A)参数设计    (B)常量设计     (C)变量设计     (D)系统设计
    50 20. 以下不属于“双五归零”基本术语的是(     )。
    51 	(A)质量问题							(B)质量缺陷		
    52 (C)重复性质量问题	                    (D)产品交付前的质量问题
    53 21. 质量检验当中,(    )可以保证工艺过程的质量符合性。
    54 (A)进货检验   (B)过程检验      (C)工艺检验      (D)最终检验
    

    从读取效果上看,各行文本数据都能很顺利的获取到。

    匹配题型、题目和具体的选项

    现在我们需要做的是就是匹配题型、题目和具体的选项,观察可以发现规律:

    1. 题型以大写数字开头
    2. 题目以普通数字+.开头
    3. 选项以括号+字母开头

    额外需要注意的:

    1. 开头几行文本也存在普通数字+.开头的,需要直接排除。
    2. 第7题的题目,和第19题的选项存在一些特殊的空白字符需要排除,
    3. 括号和小数点都同时存在半角和全角两种情况。

    对于需要注意的第二点:

    image-20210103150952127

    查看一下这2处的空白字符:

    doc.paragraphs[21].text
    
    '7.(\xa0\xa0)是第一家实施六西格玛管理的公司。\xa0'
    
    doc.paragraphs[49].text
    
    '(A)参数设计    (B)常量设计\u3000    (C)变量设计\u3000\u3000   (D)系统设计'
    

    发现分别是\xa0和\u3000。

    整理好大致思路,我组织一下处理代码:

    import re
    from docx import Document
    
    doc = Document("编号02 质检员高级技师(一级)理论试卷.docx")
    
    black_char = re.compile("[\s\u3000\xa0]+")
    
    chinese_nums_rule = re.compile("[一二三四]、(.+?)\(")
    title_rule = re.compile("\d+.")
    option_rule = re.compile("\([ABCDEF]\)")
    option_rule_search = re.compile("\([ABCDEF]\)[^(]+")
    
    
    # 从word文档的“一、单项选择题”开始遍历数据
    for paragraph in doc.paragraphs[5:25]:
        #  去除空白字符,将全角字符转半角字符,并给括号之间调整为中间二个空格
        line = black_char.sub("", paragraph.text).replace(
            "(", "(").replace(")", ")").replace(".", ".").replace("()", "(  )")
        # 对于空白行就直接跳过
        if not line:
            continue
        if title_rule.match(line):
            print("题目", line)
        elif option_rule.match(line):
            print("选项", option_rule_search.findall(line))
        else:
            chinese_nums_match = chinese_nums_rule.match(line)
            if chinese_nums_match:
                print("题型", chinese_nums_match.group(1))
    
    题型 单项选择题
    题目 1.关于道德的叙述,正确的是(  )。
    选项 ['(A)道德中的“应该”与“不应该”因人而异,没有共同道德标准']
    选项 ['(B)道德是处理人与人之间、人与社会之间关系的特殊行为规范']
    选项 ['(C)道德是现代文明的产物']
    选项 ['(D)道德从来没有阶级性']
    题目 2.以下哪个选项不属于遵守职业纪律(  )。
    选项 ['(A)右侧行驶', '(B)客人先行', '(C)先抑后扬', '(D)下班锁门']
    题目 3.国际标准化组织ISO9000:2000标准中,把质量定义为一组(  )特性满足要求的程度。
    选项 ['(A)常量', '(B)变量', '(C)流动', '(D)固有']
    题目 4.软件是有通过载体表达的信息所组成的(  )产品。
    选项 ['(A)知识', '(B)信息', '(C)数据', '(D)标准']
    题目 5.(  )是指由最高管理者正式发布的与质量有关的组织总的意图和方向。
    选项 ['(A)质量目标', '(B)质量方针', '(C)质量管理', '(D)质量控制']
    题目 6.ISO9000族当中,(  )和八项管理原则一直是最核心的内容。
    选项 ['(A)PCDA模式', '(B)PCDA循环', '(C)PDCA模式', '(D)PDCA循环']
    题目 7.(  )是第一家实施六西格玛管理的公司。
    选项 ['(A)通用电气', '(B)摩托罗拉']
    选项 ['(C)丰田', '(D)微软']
    题目 8.产生、形成、实现、使用和衰亡的过程,质量专家朱兰称质量形成的这种过程为(  )。
    

    从目前测试结果来看没有问题。

    保存匹配到的数据到结构化字典

    现在我打算将当前匹配出来的文本数据存储成字典形式的结构化数据,字典结构的设计如下:
    image-20210103151420696

    根据上述设计完善代码:

    import re
    from docx import Document
    from collections import OrderedDict
    
    doc = Document("编号02 质检员高级技师(一级)理论试卷.docx")
    
    black_char = re.compile("[\s\u3000\xa0]+")
    
    chinese_nums_rule = re.compile("[一二三四]、(.+?)\(")
    title_rule = re.compile("\d+.")
    option_rule = re.compile("\([ABCDEF]\)")
    option_rule_search = re.compile("\([ABCDEF]\)[^(]+")
    
    # 保存最终的结构化数据
    question_type2data = OrderedDict()
    # 从word文档的“一、单项选择题”开始遍历数据
    for paragraph in doc.paragraphs[5:]:
        #  去除空白字符,将全角字符转半角字符,并给括号之间调整为中间一个空格
        line = black_char.sub("", paragraph.text).replace(
            "(", "(").replace(")", ")").replace(".", ".").replace("()", "(  )")
        # 对于空白行就直接跳过
        if not line:
            continue
        if title_rule.match(line):
            options = title2options.setdefault(line, [])
        elif option_rule.match(line):
            options.extend(option_rule_search.findall(line))
        else:
            chinese_nums_match = chinese_nums_rule.match(line)
            if chinese_nums_match:
                question_type = chinese_nums_match.group(1)
                title2options = question_type2data.setdefault(question_type, OrderedDict())
    

    遍历结构化字典并存储

    然后我们遍历结构化字典,将数据保存到pandas对象中:

    import pandas as pd
    
    result = []
    max_options_len = 0
    for question_type, title2options in question_type2data.items():
        for title, options in title2options.items():
            result.append([question_type, title, *options])
            options_len = len(options)
            if options_len > max_options_len:
                max_options_len = options_len
    df = pd.DataFrame(result, columns=[
                      "题型", "题目"]+[f"选项{i}" for i in range(1, max_options_len+1)])
    # 题型可以简化下,去掉选择两个字
    df['题型'] = df['题型'].str.replace("选择", "")
    df
    

    结果:

    题型题目选项1选项2选项3选项4选项5
    0单项选择题1.关于道德的叙述,正确的是( )。(A)道德中的“应该”与“不应该”因人而异,没有共同道德标准(B)道德是处理人与人之间、人与社会之间关系的特殊行为规范©道德是现代文明的产物(D)道德从来没有阶级性None
    1单项选择题2.以下哪个选项不属于遵守职业纪律( )。(A)右侧行驶(B)客人先行©先抑后扬(D)下班锁门None
    2单项选择题3.国际标准化组织ISO9000:2000标准中,把质量定义为一组( )特性满足要求的程度。(A)常量(B)变量©流动(D)固有None
    3单项选择题4.软件是有通过载体表达的信息所组成的( )产品。(A)知识(B)信息©数据(D)标准None
    4单项选择题5.( )是指由最高管理者正式发布的与质量有关的组织总的意图和方向。(A)质量目标(B)质量方针©质量管理(D)质量控制None
    59多项选择题60.ISO出版的《质量认证的原则与实践》一书中,以下哪些术语国际上通用的形式认证( )?(A)型式试验(B)型式检验加认证后监督——市场抽样检验©型式检验加认证后监督——工厂抽样检验(D)型式检验加认证后监督——市场和工厂抽样检验(E)型式检验加工厂质量体系评定加认证后监督——质量体系复查加工厂和市场抽样检验
    60简答题61.简述KJ法的主要用途。NoneNoneNoneNoneNone
    61简答题62.ISO9001被称为“一个目的”、“两个模型”的内容分别是什么?NoneNoneNoneNoneNone
    62论述题63.请完成以下西格玛水平与DPMO的关系表格(中心偏移±1.5σ)(每空0.5分)NoneNoneNoneNoneNone
    63论述题64.请简述在PZB服务质量差距分析模型当中,质量标准差距的产生原因有哪些内容?NoneNoneNoneNoneNone

    64 rows × 7 columns

    最终保存结果:

    df.to_excel("result.xlsx", index=False)
    

    完整代码

    最终完整代码:

    import pandas as pd
    import re
    from docx import Document
    from collections import OrderedDict
    
    doc = Document("编号02 质检员高级技师(一级)理论试卷.docx")
    
    black_char = re.compile("[\s\u3000\xa0]+")
    
    chinese_nums_rule = re.compile("[一二三四]、(.+?)\(")
    title_rule = re.compile("\d+.")
    option_rule = re.compile("\([ABCDEF]\)")
    option_rule_search = re.compile("\([ABCDEF]\)[^(]+")
    
    # 保存最终的结构化数据
    question_type2data = OrderedDict()
    # 从word文档的“一、单项选择题”开始遍历数据
    for paragraph in doc.paragraphs[5:]:
        #  去除空白字符,将全角字符转半角字符,并给括号之间调整为中间一个空格
        line = black_char.sub("", paragraph.text).replace(
            "(", "(").replace(")", ")").replace(".", ".").replace("()", "(  )")
        # 对于空白行就直接跳过
        if not line:
            continue
        if title_rule.match(line):
            options = title2options.setdefault(line, [])
        elif option_rule.match(line):
            options.extend(option_rule_search.findall(line))
        else:
            chinese_nums_match = chinese_nums_rule.match(line)
            if chinese_nums_match:
                question_type = chinese_nums_match.group(1)
                title2options = question_type2data.setdefault(
                    question_type, OrderedDict())
    
    result = []
    max_options_len = 0
    for question_type, title2options in question_type2data.items():
        for title, options in title2options.items():
            result.append([question_type, title, *options])
            options_len = len(options)
            if options_len > max_options_len:
                max_options_len = options_len
    df = pd.DataFrame(result, columns=[
                      "题型", "题目"]+[f"选项{i}" for i in range(1, max_options_len+1)])
    # 题型可以简化下,去掉选择两个字
    df['题型'] = df['题型'].str.replace("选择", "")
    df.to_excel("result.xlsx", index=False)
    

    最终得到的文件:

    image-20210103150819932

    展开全文
  • 简单来说awk就是把文件逐行的读入,以空格为默认分隔符将每切片,切开的部分再进行各种分析处理。 awk有3个不同版本: awk、nawk和gawk,未作特别说明,一般指gawk,gawk 是 AWK 的 GNU 版本。 awk其名称得自于它...
  • iview表格处理后台返回的字符串

    千次阅读 2019-08-29 10:53:23
    在用vue+iview做的一个项目中,后台给我返回一个名称和费用拼接的字符串,我在iview的表格中显示出来,并且要让折显示或者是加四个空格显示。发现后台给我加上的空格在前端根本显示不出来,还得自己处理。 效果图...
  • 目录 目录 2 1 实验目的··· 3 ...3.1 状态转换图··· 4 3.2 程序源码··· 5 3.3 实验运行效果截图··· 10 4 实验体会··· 10 实验目的 1、学会针对DFA转换图实现相应的高级语言源程序。 ...
  • 面试题4:替换空格 题目:请实现一个函数,把字符串中的每个空格替换成"%20",例如输入"We are happy.",则输出"we%20are%20happy"。   在网络编程中,如果URL参数中含有特殊字符,如空格、#等,可能导致服务器端无法...
  • POI实现将excel表格转换成html代码

    万次阅读 多人点赞 2018-03-19 21:06:06
    POI转excelhtml 最近笔者在开发一个网站项目时,根据需求将用户上传的excel表格童年过java程序转换为html代码的同样格式呈现前端页面上,考虑到Apache成熟的Office文档处理工具POI的广受欢迎,我也在尝试通过POI...
  • 原博文2018-06-19 09:01 −现在:a = 10,由于暂时没找到更好的...先转换为字符串,再转换为列表,发现被分成1和0?!而不是10. 成功案例: &n...010617相关推荐2019-11-04 17:24 −对于python编程人员,装饰器的...
  • 这里是拿到输入框的内容转化为表格数据格式 //判断输入框是否有内容 if(value){ this.tableCopyValue = value; //用转换符号分割成数组 let tableRow = value.split(/\n/); let tableCopyCol = []; this....
  • 用VB 输入一字符 分别统计英文字母 数字和其他符号 ?在窗口上放两个控件,一个text1,一个command1,并注意窗口...输入一字符,分别统计出其中英文字母,空格,数字和其他字符的个数.#includeint main(){for(;c=getc...
  • 请问Python如何将print后的值导到原来的表格里(一开始导入excel利用Python计算)pandas.DataFrame.to_excel由dataframe对象直用,然后指定名、表名等各种参数。函数定义:DataFrame.to_excel(excel_writer, sheet_...
  • Excel中经常需要使用到带有斜杠的表头,斜杠具体该如何在表格中打出呢?下面是学习啦小编带来的...excel表格打斜杠的方法图1表格打斜杠步骤2:这个斜杠可以用,【绘图工具】-----【自选线条】---------【直线】------...
  • python使用正则表达式去除中文文本多余空格,保留英文之间空格方法详解在pdf转为文本的时候,经常会多出空格,影响数据观感,因此需要去掉文本中多余的空格,而文本中的英文之间的正常空格需要保留,输入输出如下:...
  • excel表格的简单制作方法教程准备材料: excel软件用excel简单制作可视化图表,首先我们需要添加“横坐标轴”的字段,在此小编举例添加的年纪班次,如图所示。此处如添加字段有顺序可寻,有个小技巧,比如说当你...
  • 本文实例讲述了Python实现小数转化百分数的格式化输出方法。分享给大家供大家参考,具体如下:比如将 0.1234 转化 12.34% 的形式:rate = .1234print('%.2f%%' % (rate * 100))第一个百分号和 .2f 相连,表示...
  • 本文转载自以下网站:50 代码爬取东方财富网上市公司 10 年近百万财务报表数据 ...4.保存表格 重点:分析表格类网站的ajax请求,以及如何保存这类信息(关于表格方面的)...
  • 1、不复制隐藏的单元格比如,截图中5-8单元格都隐藏掉了,复制的时候只想复制可见单元格。如果直接复制、粘贴,那被隐藏的数据也会被复制出来,怎样才能不复制隐藏单元格呢?方法1: 按“Ctrl + A”选中表格,接着...
  • c语法7 - 数组与字符串概述定义:把具有相同类型的若干变量按有序形式组织起来称为数组。C语言数组属于构造数据类型。一个数组可以分解多个数组元素,这些数组元素可以是基本数据...放入4个整数,就得分配4个int类...
  • 很多开发者说自从有了 Python/Pandas,Excel 都不怎么用了,用它来处理与可视化表格非常快速。...然后我们再用list直接对结果进行类型转换转换为list。In [135]:for row in rows4:print(row)('nam...
  • 面试题4:替换空格

    2018-01-24 16:49:44
    题目:请实现一个函数,把字符串中的每个空格替换成“%20”.例如输入“We are happy.”则输出“We%20are%20happy.”。 在网络编程中,如果URL参数中含有特殊字符,如空格、‘#’等,可能导致服务器端无法获得正确...
  • 功能概览pandas库的一些应用文件读入计算表格中每一的英文单词数简单用textblob进行自然语言情感分析判断中是不是有两列值都与其他重复(可推广至多)对表格中的两列自定义函数运算判断表格中某中是否有空...
  • 把这些掌握就差不多了一、建立分类下拉列表填充项我们常常要将企业的名称输入到表格中,为了保持名称的一致性,利用“数据有效性”功能建了一个分类下拉列表填充项。1.在Sheet2中,将企业名称按类别(如“工业企业”...
  • 2019独角兽企业重金招聘Python工程师标准>>> ...
  • 很多开发者说自从有了 Python/Pandas,Excel 都不怎么用了,用它来处理与可视化表格非常快速。...然后我们再用list直接对结果进行类型转换转换为list。In [135]:for row in rows4:print(row)('nam...
  • layui表格时间类型显示问题

    千次阅读 2020-07-21 19:15:56
    实体类中时间类型一般用String或者Date,前者可以直接显示在表格中,不需要进行处理。 Date类型在显示需要则进行类型转换。 当出现上图的问题后,我们需要进行时间类型转换。 就后端而言,可以将时间使用...
  • python对excel表格处理的一些小功能 功能概览pandas库的一些应用文件读入计算表格中每一的英文单词数简单用textblob进行自然语言情感分析判断中是不是有两列值都与其他重复(可推广至多)对表格中的两列...

空空如也

空空如也

1 2 3 4 5 ... 20
收藏数 23,636
精华内容 9,454
关键字:

以空格为判断标准转换表格2列4行