Python数据清洗之csv Reader zip匹配与组装

Python数据清洗之csv reader zip融合

需求概述

借助Python的CSV通过reader方法实现便利,并通过循环匹配在另外个csv里找到当前CSV字段的中文注释,将都能相互匹配到的列(字段)结合数据通过zip拼接后输出来。

数据描述

1 emp员工表的csv文件的内容

EMPNO   ENAME   JOB MGR HIREDATE    SAL COMM    DEPTNO  ALIAS

7369    SMITH   CLERK   7902    1980-12-27  800     20  sm

7499    ALLEN   SALESMAN    7698    1981-2-20   1600    300 30  al

2 empcom 员工注释表csv里文件的内容

name    label

EMPNO   雇员的编号,由四位数字所组成

ENAME   雇员的姓名,由10位字符所组成

JOB 雇员的职位

MGR 雇员对应的领导编号,领导也是雇员

HIREDATE    雇员的雇佣日期

SAL 基本工资,其中有两位小数,五倍整数,一共是七位

COMM    奖金,佣金

DEPTNO  雇员所在的部门编号

GEDER   性别

LEVEL   级别

3 补注:

1 emp.csv里的ALIAS字段不在empcom.csv里

2 empcom.csv里的GENDER、LEVEL也不在emp.csv里

代码实现

#通过csv里的reader结合list循环实现两个CSV的列名匹配并通过zip拼接list。
def collookup3():
    # 通过Reader加载emp.csv,此时EMPNO、ENAME、JOB对于第一行
    empfile = reader(open('./data/emp.csv', 'rt', encoding='utf8'), delimiter='\t')
    empcomfile = reader(open('./data/empcom.csv', 'rt', encoding='utf8'), delimiter='\t')
    empdata = [d for d in empfile]
    #仅输出匹配到emp.csv里第一行的数据(name和label)
    empcomdata = [d for d in empcomfile if d[0] in empdata[0]]
    #仅取列名即对应empcomdata的第1行的内容
    commoncol = [d[0] for d in empcomdata]
    print(commoncol)
    skip_index=[]
    finaempcol=[]
    finaempdata=[]
    for empcol in empdata[0]:
        if empcol not in commoncol:
            #将empcoldata里需要跳过(有些字段不在commcol里)的索引号记录下来
            skip_index.append(empdata[0].index(empcol))
        else:
            #将empcomcol(name和label两列追加到finaempcol里)
            for empcomcol in empcomdata:
                if empcomcol[0] == empcol:
                    finaempcol.append(empcomcol)
                    #break

            #new_empdata.append()
    #遍历emp.csv的数据行,即从第2行开始遍历
    for emp in empdata[1:]:
        emprow=[]
        #对每一列数据进行遍历,这里取行号rn和列内容coldata
        for rn,coldata in enumerate(emp):
            if rn not in skip_index:
                emprow.append(coldata) #需要通过临时list存记录再追加,否则将更改原有结构
        finaempdata.append(emprow)
    #通过zip将列注释和raw数据进行拼接
    zipdata=[]
    for finemprow in finaempdata:
        zipdata.append(list(zip(finaempcol,finemprow)))
    return zipdata


if __name__ == '__main__':
    print(collookup3())

执行结果

[[(['EMPNO', '雇员的编号,由四位数字所组成'], '7369'), (['ENAME', '雇员的姓名,由10位字符所组成'], 'SMITH'), (['JOB', '雇员的职位'], 'CLERK'), (['MGR', '雇员对应的领导编号,领导也是雇员'], '7902'), (['HIREDATE', '雇员的雇佣日期'], '1980-12-27'), (['SAL', '基本工资,其中有两位小数,五倍整数,一共是七位'], '800'), (['COMM', '奖金,佣金'], ''), (['DEPTNO', '雇员所在的部门编号'], '20')], [(['EMPNO', '雇员的编号,由四位数字所组成'], '7499'), (['ENAME', '雇员的姓名,由10位字符所组成'], 'ALLEN'), (['JOB', '雇员的职位'], 'SALESMAN'), (['MGR', '雇员对应的领导编号,领导也是雇员'], '7698'), (['HIREDATE', '雇员的雇佣日期'], '1981-2-20'), (['SAL', '基本工资,其中有两位小数,五倍整数,一共是七位'], '1600'), (['COMM', '奖金,佣金'], '300'), (['DEPTNO', '雇员所在的部门编号'], '30')]]

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

ShenLiang2025

您的鼓励是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值