Python操作excel做些统计

2016-11-01  本文已影响0人  地命海心

作为一名苦逼的打杂人员,经常要为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
上一篇下一篇

猜你喜欢

热点阅读