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

Posted ShenLiang2025

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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')]]

以上是关于Python数据清洗之csv Reader zip匹配与组装的主要内容,如果未能解决你的问题,请参考以下文章

使用 Python 的 csv.reader 处理转义引号

从 csv.reader 之后的列(Python Pandas)中获取最早的日期

如何在 Python 中为 csv.reader 设置语言环境?

数据清洗之数据转换 日期格式字符串高阶函数

数据清洗之数据表处理 筛选 增删查改 整理 层次化索引

python3.4读取.csv