源数据表,是带有一行表头的excel表,数据部分正数、负数、小数都有,主要实现以下几项功能
1、读取数据,随后将数据分为表头,和数据两部分
2、将数据部分做成一个二维数组,源数据的每一列作为二维数组的一行
3、计算二维数组每一行的平均值,存进一个新的二维数组
4、将二维数组的每一行(除最后一行不需要)中为0的数用相应行的平均值替代,存进新的二维数组。对于源数据而言就是,将表格里的除最后一列以外的每一列中为0的数用该列的平均值替代。
5、将表头和最后的二维数组进行转置后按对应顺序写入excel
附录:
python 版本是3.6.4,不知道为什么无法写入xlsx文件,只能写入xls文件。还得继续探索
# _*_ coding: utf-8 _*_
import xlrd
import xlwt
# 返回二维数组
def list_list(sheet):
sheet_col = sheet.ncols
list = []
for i in range(0, sheet_col):
tmp = sheet.col_values(i)
del tmp[0]
list.append(tmp)
# print(list)
return list
def draw_aver(list):
# print(len(list))
one_list_len = len(list[0])
list_aver = []
for i in range(len(list)):
list_aver.append(round(sum(list[i]) / one_list_len, 2))
# print(list_aver)
# print(len(list_aver))
return list_aver
def replace_num(list, list_aver):
for i in range(len(list)-1):
for j in range(len(list[0])):
if list[i][j] == 0.0:
list[i][j] = list_aver[i]
return list
def write_excel(sheet_title, list_new):
f = xlwt.Workbook()
sheet_new = f.add_sheet('res')
for i in range(len(sheet_title)):
sheet_new.write(0, i, sheet_title[i])
for i in range(len(list_new)):
for j in range(len(list_new[0])):
sheet_new.write(j+1, i, list_new[i][j])
f.save('res.xls')
pass
if __name__ == '__main__':
excel_file = xlrd.open_workbook('1443_15.xlsx')
sheet = excel_file.sheet_by_index(0)
# 表头
sheet_title = sheet.row_values(0)
# 数据表
list = list_list(sheet)
# 平均数集合
list_aver = draw_aver(list)
# 把所有为0的书替换为平均数
list_new = replace_num(list, list_aver)
# 把新的数据写会excel
write_excel(sheet_title, list_new)
pass