作为一名苦逼的打杂人员,经常要为N个部门做些统计工作,包括但不限于工作量统计、收入统计、服务质量统计。
数据格式集中在EXCEL,通常包含一个索引列,根据这个列获得一些属性数据,比如人员对应工作量等。
长长一串事务脚本通常太过ugly and dirty,Pandas有用牛刀杀鸡之嫌。
于是资深处女座精神洁癖发作,用xlrd搞了一个excel类,日常作些计数、求和、求平均的业务,还算得心应手。
PS:Xlrd新版支持.xlsx了,赞一个
直接上代码吧~
import xlrd
from collections import defaultdict, Counter
class ExcelData():
#指定excel文件位置以及索引列的名字
def __init__(self, xlsx_path, index_col=''):
workbook = xlrd.open_workbook(xlsx_path)
self.worksheet = workbook.sheet_by_index(0)
self.nrows = self.worksheet.nrows
self.ncols = self.worksheet.ncols
self.index_col = index_col
#近列名返回对应列的数据list
def get_col_by_name(self, col_name):
try:
index = self.worksheet.row_values(0).index(col_name)
except:
return None
# 返回列list,去除列名
return self.worksheet.col_values(index)[1:]
# 返回索引列及指定列的字典
def get_col_values(self, col_name):
index_col = self.get_col_by_name(self.index_col)
col = self.get_col_by_name(col_name)
return dict(zip(index_col, col))
# 指定列计数
def col_count(self, col_name):
col_values = self.get_col_by_name(col_name)
if not col_values:
r = None
else:
r = Counter(col_values)
return r
# 筛选列值按索引列计数
def index_col_count(self, col_name, filter=''):
c = defaultdict(int)
for i in range(self.nrows - 1):
if self.get_col_by_name(col_name)[i] == filter:
c[self.get_col_by_name(self.index_col)[i]] += 1
return c
# 指定列按索引列求和
def index_col_sum(self, col_name):
s = defaultdict(float)
for i in range(self.nrows - 1):
# 字典求和
s[self.get_col_by_name(self.index_col)[i]] += float(self.get_col_by_name(col_name)[i])
return s
# 指定列按索引列求平均
def index_col_avg(self, sum_dict):
a = defaultdict(float)
index_count = self.col_count(self.index_col)
for k, v in sum_dict.iteritems():
a[k] = v / index_count[k]
return a