之前由于需要处理一些从网站数据库直接提取出的excel表格,进行去重和对相应单位的编号,所以有了这一次Excel数据清洗的经历。

下面就进行详细说明。

目的:

  1. 去重

  2. 编号

使用语言:python

涉及到的主要模块:

  1. xlrd
  2. Pandas

一、知识准备

1、Pandas介绍

python的数据分析包,是作为金融数据分析工具而被开发的,这里我们主要是利用pandas将excel表格数据转化为其中的数据结构DataFrame,从而将操作excel表变成操作DataFrame。

2、DataFrame

该数据结构是一个表格型的数据结构,包含一组有序的列,每列可以是不同的值类型。拥有行索引和列索引。 具体的关于DataFrame的操作这里给出一个比较好的使用说明,里面也有介绍Series的内容:Pandas使用指南

3、xlrd介绍

在这次数据经历的工作中还使用到了python中来读取和存储excel的扩展模块——xlrd。 它的作用来对本次处理的excel表格进行读取和存储,同时也可以实现指定表单、指定单元格的读写。

4、xlrd的基本操作

1)导入模块
    import xlrd
2)打开Excel文件读取数据
    data = xlrd.open_workbook('excelFile.xls')
3)使用技巧
    获取一个工作表
    table = data.sheets()[0]                   #通过索引顺序获取
    table = data.sheet_by_index(0)             #通过索引顺序获取
    table = data.sheet_by_name(u'Sheet1')      #通过名称获取

    获取整行和整列的值(数组)
    table.row_values(i)
    table.col_values(i)

    获取行数和列数
   nrows = table.nrows
    ncols = table.ncols

    循环行列表数据
    for i in range(nrows ):
          print table.row_values(i)

    单元格
    cell_A1 = table.cell(0,0).value
    cell_C4 = table.cell(2,3).value

    使用行列索引
    cell_A1 = table.row(0)[0].value
    cell_A2 = table.col(1)[0].value

    简单的写入
    row = 0
    col = 0

    # 类型 0 empty,1 string, 2 number, 3 date, 4 boolean, 5 error
    ctype = 1 value = '单元格的值'

    xf = 0 # 扩展的格式化

    table.put_cell(row, col, ctype, value, xf)
    table.cell(0,0)  #单元格的值'
    table.cell(0,0).value #单元格的值'

二、流程

这里主要说明一下整个数据清理的逻辑。 流程介绍

三、代码

其实这次清理的整个逻辑比较简单,涉及到的比较难的部分在于Pandas中DataFrame数据结构的使用。

1、去重

#filename: delete_dup.py

# -*- coding:utf-8 -*-

import pandas as pd

# 将excel文件转换为DataFrame
df = pd.DataFrame(pd.read_excel('excel_name.xlsx'))

# 删除对应列的重复值,保留第一次出现的位置
new_df = df.drop_duplicates('1', keep='first').dropna()
print 'drop ok!'

new_df.to_excel('excel_name_fix.xlsx')

2、编号并回填

#filename: build_tag.py

# -*- coding:utf-8 -*-
import pandas as pd
import xlrd

# 生成对应索引所需文件
data = xlrd.open_workbook('ROOT_TO_YOUR_FILE_FROM_LAST_CLEAN.xlsx')
table = data.sheet_by_index(0)
# 获取行数
nrows = table.nrows

# 键值对的信息格式为 —— 名字:UID
UID = {}
# 这样会包含第一行列名的信息,问题不大
# 第二列和第三列
# 第二列:第三列
for i in range(nrows):
  UID[table.cell(i,1).value]=table.cell(i,2).value
###############################至此完成数据编号##################################

#################################下面进行回填###################################
# 待清洗数据
cleaning_data = pd.DataFrame(pd.read_excel('ROOT_TO_YOUR_FILE_TO_CLEAN.xlsx'))
# print cleaning_data
series_name = cleaning_data['UNAME']

# 生成索引
new_form =  pd.Series(UID, index=series_name)
# 添加新列为索引值
cleaning_data['UID'] = new_form.values
cleaned_data = cleaning_data


# 调整列的顺序
UID = cleaned_data.pop('UID')
cleaned_data.insert(5, 'UID', UID)

# 写文件
cleaned_data.to_excel('ROOT_TO_STORE_YOUR_CLEANED_FILE.xlsx')
print 'ok'