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匹配与组装的主要内容,如果未能解决你的问题,请参考以下文章
从 csv.reader 之后的列(Python Pandas)中获取最早的日期