美文网首页
Python操作excel做些统计

Python操作excel做些统计

作者: 地命海心 | 来源:发表于2016-11-01 00:00 被阅读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
    

    相关文章

      网友评论

          本文标题:Python操作excel做些统计

          本文链接:https://www.haomeiwen.com/subject/khzputtx.html