Python数据清洗之csv Reader lookup匹配缺失列

Posted ShenLiang2025

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python数据清洗之csv Reader lookup匹配缺失列相关的知识,希望对你有一定的参考价值。

Python通过csv Reader 缺失列匹配

需求概述

借助Python的CSV通过reader方法实现便利,并通过循环匹配在另外个csv里找到当前CSV字段的中文注释,匹配的不到的显示为”未知”。

数据描述

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的列名匹配。

def collookup2():
    # 通过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]
    #遍历每一行,当前每一行的list对应2个元素即"name"和"label"
    empcomdata = [d for d in empcomfile]
    #定义个list接收在empcom.csv里而不在emp.csv的"name"(字段)
    bad_rows=[]
    '''#双层循环不能找到匹配和不匹配的列名
    for i in empdata[0]:
        for j in empcomdata:
            if i in j:
                print('match',i,j)
    '''
    #通过对empcom.csv逐行遍历,取empcomcol[0]即取name列。empdata[0]对应emp.csv的第一行。
    for empcomcol in empcomdata:
        if empcomcol[0] not in empdata[0]:
            bad_rows.append(empcomcol)
    #print(bad_rows)
    #遍历bad_rows从empcomdata里删除不匹配emp.csv的列名
    for h in bad_rows:
        empcomdata.remove(h)
    #print(empcomdata)

    #对匹配empdata[0]的empcomdata[0]再次遍历,此时仅关注name列。
    all_col = [h[0] for h in empcomdata]

    #如果empdata[0]不在empcomdata[0]里就记住"未知"
    miss_empcom=[]
    for i in empdata[0]:
        if i not in all_col:
            miss_empcom.append(i)
            miss_empcom.append('未知')

    print(miss_empcom)
    #追加"未知"的数据和都能匹配上的数据
    empcomdata.append(miss_empcom)
    return empcomdata

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

执行结果

[['EMPNO', '雇员的编号,由四位数字所组成'], ['ENAME', '雇员的姓名,由10位字符所组成'], ['JOB', '雇员的职位'], ['MGR', '雇员对应的领导编号,领导也是雇员'], ['HIREDATE', '雇员的雇佣日期'], ['SAL', '基本工资,其中有两位小数,五倍整数,一共是七位'], ['COMM', '奖金,佣金'], ['DEPTNO', '雇员所在的部门编号'], ['ALIAS', '未知']]

:这里每个list里元素是只有2元素的list。

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

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

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

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

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

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

python3.4读取.csv